1.3.2 Scala用更少的代码做更多的事情
为了体会Scala语言的简洁性,我们不得不深入代码了。下面两段代码清单是判断给定字符串中是否有大写字母的例子,分别用Scala和Java实现。
清单1.2 使用Java判断给定字符串中是否有大写字母
boolean hasUpperCase = false;
for(int i = 0; i < name.length(); i++) {
if(Character.isUpperCase(name.charAt(i))) {
hasUpperCase = true;
break;
}
}
在上述代码中,遍历给定字符串name
中的字符,如果遇到某字符是大写,则将hasUpperCase
置为true
,结束遍历。
现在来看Scala中的做法:
清单1.3 使用Scala判断给定字符串中是否有大写字母
val hasUpperCase = name.exists(_.isUpper)
在Scala中,实现此功能只需一行代码。尽管做的工作是一样的,但大多数死板的程式化代码已经从程序员的手中移出了。
在这个例子中,你调用了字符串name
的一个exists
方法,传递了一个_
占位符,判断这个占位符代表的字符是否是大写。
这充分展示了Scala语言的简洁性和可读性。
接下来,让我们继续观察下面的例子。
例中代码定义了一个Programmer
类,类中有name
、language
和favDrink
三个属性。
清单1.4 使用Java定义一个Programmer类
public class Programmer {
private String name;
private String language;
private String favDrink;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
public String getFavDrink() {
return favDrink;
}
public void setFavDrink(String favDrink) {
this.favDrink = favDrink;
}
}
这是一个仅仅拥有三个属性的简单POJO(Plain Ordinary Java Object——简单Java对象)。 而在Scala中,创建这样一个简单类,你只需一行代码,如下:
清单1.5 使用Scala定义一个Programmer类
class Programmer(var name:String,var language:String,var favDrink:String)
上例中用Scala创建了一个简单类Programmer
,与Java不同的是,它使用了一个带三个参数的主构造器(primary constructor,类似于Java的默认构造器)。
是的,你可以在声明类的同时定义一个构造器——这是Scala简洁性的另一个例子。
参数前的var
会让Scala编译器为类的此参数的对应域生成getter
和setter
方法。
看上去不错,不是吗?
随着你对Scala理解的加深,本书还将呈现更多有趣的例子。
就目前来说,一个非常清楚的事实是,Scala可以用更少的代码做更多的事情。
你可能会争辩说这并不是问题,IDE会自动生成那些程式化代码。
但是我要说的是,这些生成出来的代码,不也是需要你来维护的吗?
当看过相关例子之后,你会发现Scala的简洁性是非常显而易见的。
实现一个相同的功能,Java的代码量往往是Scala的3-10倍。
链接
- 目录
- 下一节: 1.4 如果你来自某种动态语言