Java8发布已经有一段时间了,这次发布的改动比较大,很多人将这次改动与Java5的升级相提并论。Java8其中一个很重要的新特性就是lambda表达式,允许我们将行为传到函数中。想想看,在Java8 之前我们想要将行为传入函数,仅有的选择就是匿名内部类。Java8发布以后,lambda表达式将大量替代匿名内部类的使用,简化代码的同时,更突出了原来匿名内部类中最重要的那部分包含真正逻辑的代码。尤其是对于做数据的同学来说,当习惯使用类似scala之类的函数式编程语言以后,体会将更加深刻。现在我们就来看看Java8中lambda表达式的一些常见写法。
lambda体中调用方法的参数列表和返回值类型,要和函数式接口中抽象方法的参数列表和返回值类型保持一致。
一、替代匿名内部类
lambda表达式用的最多的场合就是替代匿名内部类,实现Runnable接口是匿名内部类的经典例子。lambda表达式的功能相当强大,用()->就可以代替整个匿名内部类!
packageOSChina.Lambda; importorg.junit.Test; importjava.util.Comparator; importjava.util.function.Consumer; importjava.util.function.Function; importjava.util.function.Predicate; importjava.util.function.Supplier; publicclassTest1{ publicstaticvoidmain(String[] args){ Runnable runnable =newRunnable() { @Override publicvoidrun(){ System.out.println("普通,线程启动"); } }; runnable.run(); test2(); test3(); test4(); test5(); } //无参数,无返回值 publicstaticvoidtest2(){ //“->”左边只有一个小括号,表示无参数,右边是Lambda体(就相当于实现了匿名内部类里面的方法了,(即就是一个可用的接口实现类了。)) Runnable runnable = ()->System.out.println("Lambda 表达式方式,线程启动"); runnable.run(); } //有一个参数,并且无返回值 publicstaticvoidtest3(){ //这个e就代表所实现的接口的方法的参数, Consumer<String> consumer = e->System.out.println("Lambda 表达式方式,"+e); consumer.accept("传入参数"); } //有两个以上的参数,有返回值,并且 Lambda 体中有多条语句 publicstaticvoidtest4(){ //Lambda 体中有多条语句,记得要用大括号括起来 Comparator<Integer> com = (x, y) -> { System.out.println("函数式接口"); returnInteger.compare(x, y); }; intcompare = com.compare(100,244); System.out.println("有两个以上的参数,有返回值,"+compare); } //若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写 publicstaticvoidtest5(){ //Comparator com = (x, y) -> Integer.compare(100, 244); System.out.println("若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写,"+Integer.compare(100,244)); } }