lambda表达式
lambda可以让java以函数式编程.
该特性是自JDK8之后推出的.
使用lambda可以方便快捷创建匿名内部类。
语法:
(参数列表)->{
方法体
}
使用lambda创建的匿名内部类实际所属的接口必须只能有一个方法.否则编译不通过.
lambda表达式第一种 无参数的写法
public class LambdaDemo1 {
public static void main(String[] args) {
//例如原先需要创建线程任务
Runnable r1=new Runnable() {
@Override
public void run() {
System.out.println("hello");
}
};
//现在可以这样 lambda表达式是编译器认可 JVM虚拟机不认可,也就是说编译器在编译时候给你加上去了
Runnable r2=()->{
System.out.println("hello");
};
//如果你的方法体里只有一句代码 还可以简化 连{}也可以不用写
Runnable r3=()->System.out.println("hello");
;
}
}
lambda表达式第二种 有参数的写法
public class LambdaDemo2 {
public static void main(String[] args) {
List<String> list=new ArrayList<>();
list.add("传奇");
list.add("小泽老师");
list.add("苍老师");
System.out.println(list);
//自然排序 要求集合内元素实现Comparable接口 对代码具有侵入性
//Collections.sort(list);
//建议定义比较器的方式进行排序 普通写法
// Comparator<String> com=new Comparator<String>() {
// @Override
// public int compare(String o1, String o2) {
// return 0;
// }
// };
//不需要写参数类型
Comparator<String> com=(o1,o2)->{
return o1.length()-o2.length();
};
//因为里面就一句话,因此{}也不需要写 但是注意:这里是return 有返回值的,如果不写{} 请把return也去掉
Comparator<String> com2=(o1,o2)-> o1.length()-o2.length();
// Collections.sort(list, new Comparator<String>() {
// @Override
// public int compare(String o1, String o2) {
// return 0;
// }
// });
//那么可以这么写
Collections.sort(list,(o1,o2)->o1.length()-o2.length() );
}
}
Lambda表达式的经典用法:集合遍历
JDK8之后集合和Map都支持了一个新的方法:
foreach,可以使用lambda遍历集合元素.
由于该方法是集合自行提供的,那么在使用一个线程安全的集合或Map时,
该种遍历方式也是并发安全的(原迭代器模式不与集合方法互斥,并发需要自行维护)
public class LambdaDemo3 {
public static void main(String[] args) {
List<String> list=new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
list.add("four");
for(String str:list){
System.out.println(str);
}
//JDK8支持的新方式
list.forEach((item)-> System.out.println(item));
Map<String,Integer> map=new HashMap<>();
map.put("语文", 99);
map.put("数学", 98);
map.put("英语", 97);
//遍历map时候是两个参数 分别是key和value
map.forEach((a,b)-> System.out.println(a+":"+b));
}
}