Java 8最值得学习的特性就是Lambda表达式。Lambda写的好可以极大减少代码冗余,同时可读性也好过冗长的内部类,匿名类。
举例说明一下:
(1)创建线程传统写法:
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
System.out.println("hello~");
}
});
t1.start();
lambda表达式写法:
Thread t2=new Thread(()->System.out.println("hello~lambda"));
t2.start();
(2)排序传统写法:
List<String> list=Arrays.asList(new String[]{"b","c","a"});
Collections.sort(list,new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
lambda写法:
Collections.sort(list,(o1,o2)->o1.compareTo(o2));
Lambda表达式配合java 8新特性Stream API可以将业务功能通过函数式编程简洁的实现。
lambda表达式的组成:参数列表,箭头,以及一个语句块或者是表达式。
()->{}
(int x,int y)->x+y //表达式
(int x,int y)->{x+y}; //语句块
()为参数列表,参数的类型可以省略,java编译器可以自动推断。如果只有一个参数且可以被java推断出类型,那么参数列表也可以省略。Lambda表达式的类型叫做“目标类型”,他是一个“函数接口”。(定义:如果一个接口只有一个显式声明的抽象方法,那么它就是一个函数接口,一般用@FunctionalInterface标注出来(也可以不标))。
所以可以用lambda表达式为一个函数接口赋值,比如,Runnable就是一个函数接口,因为它只有一个显式声明的run方法。所以可以用lambda表达式如下:
Runnable r1=()->{System.out.println("hellodake");};
一个lambda表达式只有在转型成一个函数接口后才能被当作Object使用。所以不能如下使用:
System.out.println(()->{System.out.println();});
必须先将lambda转型如下:
System.out.println((Runnable)()->{System.out.println();});
一个lambda可以有多个目标的类型(函数接口),只要函数匹配成功就行,但至少应该有一个。
所以以下这种情况也是可以的。
Runnable r2=()->{System.out.println("hello");};
MyRunnable r3=()->{System.out.println("dake");};
应用
(1)lambda表达式主要用于替换匿名内部类,各种回调,比如事件响应器,传入Thread类的Runnable等。如:
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
while(true){
System.out.println("hello");
}
}
});
Thread t2=new Thread(()->System.out.println());
(2)lambda表达式与集合类批处理操作
未使用lambda表达式的集合迭代操作:
for(String str:list){
System.out.println(str);
}
使用后可以调整为:
list.forEach(str->{System.out.println(str);});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)