1.3.2 Scala用更少的代码做更多的事情

为了体会Scala语言的简洁性,我们不得不深入代码了。下面两段代码清单是判断给定字符串中是否有大写字母的例子,分别用Scala和Java实现。

清单1.2 使用Java判断给定字符串中是否有大写字母

  1. boolean hasUpperCase = false;
  2. for(int i = 0; i < name.length(); i++) {
  3. if(Character.isUpperCase(name.charAt(i))) {
  4. hasUpperCase = true;
  5. break;
  6. }
  7. }

在上述代码中,遍历给定字符串name中的字符,如果遇到某字符是大写,则将hasUpperCase置为true,结束遍历。 现在来看Scala中的做法:

清单1.3 使用Scala判断给定字符串中是否有大写字母

  1. val hasUpperCase = name.exists(_.isUpper)

在Scala中,实现此功能只需一行代码。尽管做的工作是一样的,但大多数死板的程式化代码已经从程序员的手中移出了。 在这个例子中,你调用了字符串name的一个exists方法,传递了一个_占位符,判断这个占位符代表的字符是否是大写。 这充分展示了Scala语言的简洁性和可读性。 接下来,让我们继续观察下面的例子。 例中代码定义了一个Programmer类,类中有namelanguagefavDrink三个属性。

清单1.4 使用Java定义一个Programmer类

  1. public class Programmer {
  2. private String name;
  3. private String language;
  4. private String favDrink;
  5. public String getName() {
  6. return name;
  7. }
  8. public void setName(String name) {
  9. this.name = name;
  10. }
  11. public String getLanguage() {
  12. return language;
  13. }
  14. public void setLanguage(String language) {
  15. this.language = language;
  16. }
  17. public String getFavDrink() {
  18. return favDrink;
  19. }
  20. public void setFavDrink(String favDrink) {
  21. this.favDrink = favDrink;
  22. }
  23. }

这是一个仅仅拥有三个属性的简单POJO(Plain Ordinary Java Object——简单Java对象)。 而在Scala中,创建这样一个简单类,你只需一行代码,如下:

清单1.5 使用Scala定义一个Programmer类

  1. class Programmer(var name:String,var language:String,var favDrink:String)

上例中用Scala创建了一个简单类Programmer,与Java不同的是,它使用了一个带三个参数的主构造器(primary constructor,类似于Java的默认构造器)。 是的,你可以在声明类的同时定义一个构造器——这是Scala简洁性的另一个例子。 参数前的var会让Scala编译器为类的此参数的对应域生成gettersetter方法。 看上去不错,不是吗? 随着你对Scala理解的加深,本书还将呈现更多有趣的例子。 就目前来说,一个非常清楚的事实是,Scala可以用更少的代码做更多的事情。 你可能会争辩说这并不是问题,IDE会自动生成那些程式化代码。 但是我要说的是,这些生成出来的代码,不也是需要你来维护的吗? 当看过相关例子之后,你会发现Scala的简洁性是非常显而易见的。 实现一个相同的功能,Java的代码量往往是Scala的3-10倍。

链接