JDK 1.8 新特性之Lambda表达式
在说Lambda表达式之前,先介绍一下函数式接口
函数式接口
就是只定义了一个抽象方法的接口,我们可以使用注解@Functionallnterface,来强约束这种接口为函数式接口。如Runnable、Callable、Comparator等接口。
Java内置的四大函数式接口:Consumer<T>,Supplier<T>,Function<T,R>,Predicate<T>。
Lambda表达式就是专门用来实现这些函数式接口的表达式。
@FunctionalInterface public interface Runnable { public abstract void run(); }
以Runnbale线程为例
Runnable runnable = new Runnable() { @Override public void run() { System.out.println("hello lambda!"); } }; new Thread(runnable).start();
用Lambda表达式则可修改为:
Runnable runnable = ()->{ System.out.println("hello lambda!"); }; new Thread(runnable).start();
其中参数列表:与接口中方法的参数列表要求一致。
Lambda特点总结
- 参数列表中的参数类型可以直接都忽略掉不写。(注意是参数类型,不是参数。因为因为JVM编译器通过上下文推断出数据类型)
- 如果只有一个参数,圆括号也可以省略
- 方法体如果只有一语句,可以省略掉大括号
- 如果仅有一条语句,并且他是return语句的话,那么可以直接省略掉return关键字
示例
语法一:无参数,且无返回值类型
public void test() { Runnable runnable = new Runnable() { @Override public void run() { System.out.println("Hello Lambda!"); } }; runnable.run(); } /** * () -> System.out.println("Hello Lambda!"); */public void test() { // "->" 左边只有一个小括号,表示无参数,右边是Lambda体(相当于实现了匿名内部类里面的方法了,即一个可用的接口实现类了) Runnable runnable = ()->System.out.println("Hello Lambda!"); runnable.run(); }
语法二:一个参数,且无返回值类型
/** * (x) -> System.out.println(x) */ public void test() { //这个e就代表所实现的接口的方法的参数 Consumer<String> consumer = (e)->System.out.println("Hello"+e); consumer.accept("Lambda"); } /** * x -> System.out.println(x)
* 一个参数的话“()”可以省略 */ public void test() { //这个e就代表所实现的接口的方法的参数 Consumer<String> consumer = e->System.out.println("Hello"+e); consumer.accept("Lamdba"); }
语法三:两个以上的参数,且有返回值,且 Lambda 体中有多条语句
public void test4() { //Lambda 体中有多条语句,要用大括号括起来 Comparator<Integer> com = (x, y) -> { System.out.println("函数式接口"); return Integer.compare(x, y); }; int compare = com.compare(100, 244); System.out.println(compare); }