这本书的第二章主要的内容是,
1,介绍lambda表达式。Lambda表达式的结构。
2,Lambda表达式是中的变量是不可变的,不是变量。
3,介绍函数式接口
4,参数的类型推断。
可能有些java开发者并不明白为什么java用的好好的为什么要添加lambda这样一种编程方式,该书的作者并没有直接给出答案,你如果使用过lambda这个原因就不言而喻。
对于不了解的事物,首先我们会问他能做什么,首先解读这本书的第二章我们可以回答一下几个问题。
1,什么是lambda表达式?
2,Lambda表达式的作用?
3,Lambda表达式的一些特性?
首先让我们来看一下第一个问题,什么是lambda表达式,Lambda 表达式”(lambda expression)是一个匿名函数,设计的目的是为了方便java程序员将行为(代码)作为参数传递。当然传统java匿名内部类的目的和lambda表达式的设计目的是一样的。只是lambda形式更简洁。
既然你知道了lambda表达式的目的就是为了传递行为,而非传递值。那么传递行为的具体表现又是什么呢?对比面向对象编程,方法的参数可以是基本类型,对象,集合等类型。如果方法的参数是方法。就表示传递行为。作者给了一个例子:
用Swing编写了一个button点击button触发一个事件。使用匿名内部类将行为和按钮单击进行关联。
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("这个是一个button");
}
});
在这个例子中,我们创建了一个新对象,它实现了ActionLtistener接口。这个接口只有一个方法actionPerformed,当用户点击屏幕上的按钮时,button 就会调用这个方法。匿名内部类实现了该方法。
这实际上是一个代码即数据的例子——我们给按钮传递了一个代表某种行为
的对象。
你会发现每次使用这种匿名内部类,都是固定的模板:
New 接口名称(){
实现方法{
业务逻辑
}
}
New出来的就是需要传递的对象。这样读代码的时候就比较多。若我们只想传递业务逻辑,而不是对象,就可以使用lambda表达式。
Lambda如下:
jButton.addActionListener(eve -> System.out.println("这个是一个button"));
和传入一个实现某接口的对象不同,我们传入了一段代码块——一个没有名字的函数。event 是参数名,和上面匿名内部类示例中的是同一个参数。-> 将参数和 Lambda 表达式 的主体分开,而主体是用户点击按钮时会运行的一些代码。
和使用匿名内部类的另一处不同在于声明 event 参数的方式。使用匿名内部类时需要显式 地声明参数类型 ActionEvent event,而在 Lambda 表达式中无需指定类型,程序依然可以 编译。这是因为 javac 根据程序的上下文(addActionListener 方法的签名)在后台推断出 了参数 event 的类型。这意味着如果参数类型不言而明,则无需显式指定。稍后会介绍类 型推断的更多细节,现在先来看看编写 Lambda 表达式的各种方式。
Java 8 中对类型推断系统的改善值得一提。上面的例子将 new HashMap<>() 传给 useHashmap 方法,即使编译器拥有足够的信息,也无法在 Java 7 中通过 编译。
原文链接:https://mp.weixin.qq.com/s/FsS8CClkT-8zbyhoSw6C3w
作者:一起写代码