技术开发 频道

编程没有银弹 探讨Java8新增特性优缺点

  函数式接口

  在Java 8里将会有一个全新的功能——函数式接口(functional interfaces),就是可以在接口里面添加默认方法,并且这些方法可以直接从接口中运行。

  这样就可以在接口中实现集合的向后兼容,并且无需改变实现这个方法的类,就可以让Stream放置到接口中。一般而言,在接口中创建一个默认方法,然后实现该接口的所有类都可以使用Stream(无论是默认方法还是非默认方法)。

  基本上就是一种多继承形式,这样就变成了实现者之间的问题,作为实现人员,必须重写这些方法,他们可以选择使用超方法(supermethod),这也就意味着,许多实现接口的类需要改写。

  这有可能是Java 8里最让人关心的细节,也许Java 8里的函数式接口对于熟悉Scala的开发者来说不算新功能,但是他们可能会拿函数式接口与Scala的特征进行比较。然而,两者之间不同的是:Java 8里的函数式接口不能将一个引用指向实现类,而Scala允许通过self关键字来实现该操作。会有一些语言狂热者说,Java 8里的函数式接口只允许多继承行为,而不是状态。而Scala里的多继承特征既可以是行为也可以是状态。

  在Java里实现事务和其它项目,我们一般会使用 JavaAssist或 cglib的扩展类来构建动态代理和字节码操作。而Scala的特行可以让我们更直接地实现。

  一方面,函数式接口可能会被以继承方式滥用,另一方面,它们尽量不与Scala特征重复。

  Lambda

  Java 8的另一大亮点是引入Lambda表达式,使用它设计的代码会更加简洁。当开发者在编写Lambda表达式时,也会随之被编译成一个函数式接口。下面这个例子就是使用Lambda语法来代替匿名的内部类,代码不仅简洁,而且还可读。

  没有使用Lambda的老方法:

  button.addActionListener(new ActionListener() 
  { public void actionPerformed(ActionEvent ae) 
    { System.out.println(“Action Detected”); 
    } 
   } );

  使用Lambda:

  button.addActionListener(e -> 
  { System.out.println(“Action Detected”); } );

  让我们来看一个更明显的例子。

  不采用Lambda的老方法:

  正如你所看到的,使用Lambda表达式不仅让代码变的简单、而且可读、最重要的是代码量也随之减少很多。然而,在某种程度上,这些功能在Scala等这些JVM语言里已经被广泛使用。

  并不奇怪,Sclala社区是难以置信的,因为许多Java 8里的内容看起来就像是从Scala里搬过来的。在某种程度上,Java 8的语法要比Scala的更详细但不是很清晰,但这并不能说明什么,如果可以,它可能会像Scala那样构建Lambda表达式。

  一方面,如果Java继续围绕Lambda来发展和实现Scala都已经实现的功能,那么可能就不需要Scala了。另一方面,如果它只提供一些 核心的功能,例如帮助匿名内部类,那么Scala和其他语言将会继续茁壮成长,并且有可能会凌驾于Java之上。其实这才是最好的结果,有竞争才有进步, 其它语言继续发展和成长,并且无需担心是否会过时。

1
相关文章