Java 8之Lambda表达式学习

25 阅读2分钟

1、前言说明

在java8中我认为增加的新特性中,Lambda是使用频率比较高,但是对于初学者可能会让人感觉非常抽象,此文主要记录本人学习体会。

2、Lambda的作用

在Java中,Lambda表达式最大的作用是使代码更为简洁和可读。它为编写函数式接口的实现提供了一种更为简洁的语法,从而减少冗长的匿名内部类的使用。Lambda表达式使得在集合操作、事件处理和并行计算等方面编写代码变得更加简单和直观,这是GPT给出的答案,想必大家在使用过程中也会有这种体会。说白了就是通过Lambda表达式对匿名内部类进行简化,这里需要重申的是,并不是所有的匿名内部类都可以被简化,只有单方法的接口才可以。

3、Lambda表达式

() -> System.out.println("努力小澜")

初次看到这样的表达式会让人感觉非常抽象,但是如果明白Lambda是如何通过匿名内部类进行简化的就会很清晰。

4、如果通过Lambda对匿名内部类进行简化

请看以下demo,在java中有很多类似的接口,例如

public interface demoInterface {  
void test(String name);  
}
package lambdaDemo;  
  
public class demo {  
  
// 使用lambda表达式  
public static void main(String[] args) {  
demoInterface demo = new demoInterface() {  
@Override  
public void test(String name) {  
System.out.println(name);  
}  
};  
demo.test("zpl");  
  
demoInterface demo2 = (String name) -> {  
System.out.println(name);  
};  
demo2.test("zpl");  
  
demoInterface demo3 = name -> System.out.println(name);  
demo3.test("zpl");  
}  
}

在以上的demo中可以看到,一开始通过匿名内部类对接口进行重写,相当于demo是一个实例,通过demo对test方法进行调用,但是由于这个函数式接口,所有可以通过Lambda表达式对方法进行简化,其中name变量对应name,并且如果方法只有一行,此时return关键字也可以省略。

5、结合stream流进行分析

package lambdaDemo;  
  
import java.util.ArrayList;  
import java.util.List;  
import java.util.function.Consumer;  
  
public class streamDemo {  
public static void main(String[] args) {  
List<Integer> demo = new ArrayList<>();  
demo.add(1);  
demo.add(2);  
demo.add(3);  
demo.add(4);  
//  
Consumer<Integer> consumer = new Consumer<Integer>() {  
@Override  
public void accept(Integer integer) {  
System.out.println(integer);  
}  
};  
consumer.accept(155); // 这里是真正执行的地方  
//  
demo.stream().forEach(consumer);  
  
// 因为Consumer是一个函数式接口,所以可以使用lambda表达式  
demo.stream().forEach(s -> System.out.println(s));  
}  
}

从用例中也能看到,在forEach中传入的就是一个Lambda表达式,Consumer接口就是一个函数式接口,也可以通过@FunctionalInterface注解来判定,实际上在调用accept的时候才会真正执行。

未完待续