为什么要用lambda表达式?
1.java中普通命令式编程参数的传入和返回只能是值或者是对象的引用,我们无法将一个函数作为参数的方法,也无法声明返回一个函数的方法。
2.由于python语言受欢迎程度呈线性增长,函数式编程也得到了业界的肯定。
总结以上两点,java8中添加了一些新的特性,这是java有史以来版本改动中最大的一次,其中在保证了传统命令式编程风格的基础上,增加了函数式编程风格,lambda表达式便能在方法中的参数和返回值上传入和返回一个函数的方法。
- lambda表达式的语法:
1.无参且方法体只有一句时,可以省略{}
() -> System.out.println("语法1")
2.有参且方法体只有一句时,可以省略{}
(param) -> System.out.println("语法1")
3.有参且方法体多句时
(param1,param2) -> {
System.out.println(param1);
System.out.println(param2);
}
...
- 匿名内部类:
1.Thread:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("命令式");
}
}).start();
new Thread(() -> System.out.println("函数式")).start();
2.Comparator:
List<String> list = Arrays.asList("zs","ls","ww");
//命令式:
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
//函数式1
Collections.sort(list,(a,z)->a.compareTo(z));
//函数式2
Collections.sort(list, String::compareTo);
- forEach:
List<Integer> list= Arrays.asList(1,2,3,4,5,6);
//命令式:如下也是匿名内部类,Consumer接口是java中内置的函数式接口
list.forEach(new Consumer<Integer>() {
@Override
public void accept(Integer integer) {
System.out.println(integer);
}
});
//函数式
list.forEach(i -> System.out.println(i));
其实lambda表达式就是重写了接口中方法的一个对象
-
. 函数式接口
-
自定义函数式接口
@FunctionalInterface interface test{ void mytest(); String toString(); }
lambda表达式必须依赖于函数式接口,则函数式接口中有且只能存在一个抽象方法(重写Object的方法除外)。接口上添加@FunctionalInterface表明此接口是函数式接口(也可以不加此注解,java会通过上下文来进行推断,但必须保证抽象方法只能存在一个)
-
四大内置函数式接口
-
Consumer:消费型接口
/** * Consumer<T>:消费型接口 * void accept(T t);一参无返回值 */ @Test public void test01(){ eat(1000,e -> System.out.println("小明吃饭,消费"+e+"元")); } public void eat(double money, Consumer<Double> consumer){ consumer.accept(money); }
-
Supplier:供给型接口
/** * Supplier<T>:供给型接口 * T get();无参有返回值 */ @Test public void test02(){ List<Integer> list = getNumList(10, () -> (int) (Math.random() * 100)); list.forEach(i -> System.out.println(i)); } public List<Integer> getNumList(int num, Supplier<Integer> supplier){ List<Integer> list = new ArrayList<>(); for (int i = 0; i < num; i++) { Integer integer = supplier.get(); list.add(integer); } return list; }
-
-
未完待续…