① Lambda表达式作用:
Lambda表达式属于Jdk8的新特性,可以帮助我们实现接口。
传统的接口实现方式有使用匿名内部类,如创建线程时需要实现Runnable接口,会采用如下方法:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("hello,world");
}
},"A").start();
但是在创建多个线程时,这种方法往往需要复写多次,使得代码量很大,而使用Lambda表达式可以很好
的简化代码。
② 如何创建Lambda表达式:
Lambda表达式口诀:拷贝小括号,写死右箭头,落地大括号。
即 ( ) -> { }; 小括号为函数的参数,大括号内为函数的工作。
如上面的实现Runnable接口可以使用Lambda表达式简化:
new Thread(() -> { System.out.println("hello,world");},"A").start();
③Lambda表达式对接口的要求(函数式接口):
Lambda表达式一般用于实现函数式接口,而函数式接口均带有注解@FunctionalInterface(默认
情况下隐藏),而所谓的函数式接口就是在此接口中只有一个抽象的方法。
注意:
1.Java8的另一新特性就是允许在接口中使用default实现方法,但deafult函数不会影响Lambda的上
述原则,即函数式接口中允许有多个default。
2.接口中的静态方法,即public static XXX 也不会影响Lambda原则。
如Java中自带的4大函数式接口,均可用Lambda表达式对方法进行重写:
接口名 | 参数类型 | 返回类型 | 用途 |
---|---|---|---|
Consumer< T > 消费型接口 | T | void | 需要传参,但无返回值,重写accept()方法 |
Supplier< T > 供给型接口 | 无 | T | 无需传参,但有返回值,重写get()方法 |
Function< T , R > 函数型接口 | T | R | 传入参数T,返回参数R,重写apply()方法 |
Predicate< T > 断定(布尔)型接口 | T | boolean | 传入参数T,返回boolean型数据,重写test()方法 |
④System.out::println 是怎么回事?
其实System.out::println也是Lambda表达式的一种形式,Lambda表达式允许使用4种方式的双冒号。
种类 | 使用方法 | 对应的Lambda表达式 |
---|---|---|
引用特定对象的实例方法 | Object::instanceMethod | (a,b,…) ->特定对象.实例方法(a,b,…) |
引用类方法 | Class::staticMehtod | (a,b,…) ->类名.类方法(a,b,…) |
引用某类对象的实例方法 | Class::instanceMethod | (a,b,…) ->a.实例方法(a,b,…) |
引用构造器 | Class::new | (a,b,…) ->new 类名(a,b,…) |
System.out::println就是使用了第一种方法,即引用特定对象的实例方法,这是由于System.out是java
.io.PrintStream的实例化对象。
这就是为什么有 list.forEach(system.out::println)这样的写法出现了,查看forEach的源码,可以发
现参数为Consumer的消费型接口,即传入参数T,不需要传出参数,只需要通过Lambda表达式重写accept()
即forEach((t) -> {System.out.println(t);})
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
⑤Stream流式计算
现代java越来越流行链式编程(注解 @Accessors(chain = true ))+流式计算的形式。
1、什么是Stream(流)?
Stream(流)是数据渠道,用于操作数据源(集合,数组等)所生成的元素序列。(集合讲的是数据,流讲的
是计算)
2、Stream(流)的作用:
Stream能够实现类似Sql语句一样的对大批量数据进行筛选,聚合等操作与Lambda表达式共用可以大大提高
编程效率。(如大数据中的数据清洗)
3、流的计算
1.创建一个Stream:一个数据源(数组,集合)
2.中间操作:一个中间操作,处理数据源数据
3.终止操作:一个终止操作,执行中间操作链产生结果