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的时候才会真正执行。
未完待续