lambda是JDK8之后推出的一个特性,让我们可以函数式编程
lambda可以更简单的完成匿名内部类的创建
语法规则
([参数列表])->{
方法体
};
使用lambda创建的匿名内部类所属结构必须只能有一个抽象方法。否则无法使用。
凡是能用lambda表达式的接口 都会有FunctionaInterface注解。
示例
无参数的lambda表达式
/* * 匿名内部类创建Runnable */ Runnable r1 = new Runnable() { public void run() { System.out.println("hello"); } }; /* * lambda表达式创建 */ //编译器根据代码进行分析。这时编译器认可的,最终编译器会将代码改为原来的形式。 Runnable r2 = ()->{ System.out.println("hello"); }; //如果方法中只有一句代码那么lambda的{}可以省略,即可以写成: Runnable r2 = ()->System.out.println("hello");
有参数的lambda表达式
List<String> list = new ArrayList<String>(); list.add("辽宁"); list.add("小黑"); list.add("发黄"); /*匿名内部类创建比较器*/ Comparator<String> com = new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.length()-o2.length(); } }; Collections.sort(list,com); System.out.println(list); /*lambda创建*/ Comparator<String> com2 = (o1,o2)->{ return o1.length()-o2.length(); }; Collections.sort(list,com2); System.out.println(list);
使用lambda来遍历集合和Map
JDK8之后集合和Map推出了一个方法:forEach
该方法可以使用lambda来遍历集合和Map推。
由于该方法是集合自身的方法进行遍历,那么如果集合是一个并发安全的集合时,这种遍历方法是可以和其他集合操作进行互斥的达到并发安全。
原迭代器的方式遍历是不与集合自身方法互斥的,需要自行维护并发安全问题。
语法:
list.forEach( (e)->{。。。。} );
1 List<String> list = new ArrayList<String>(); 2 list.add("1"); 3 list.add("2"); 4 list.add("3"); 5 list.add("4"); 6 System.out.println(list); 7 8 //编译器会根据上下文推测e的类型,此时e为String类型 9 list.forEach((e)->System.out.println(e));
//输出结果为 [1, 2, 3, 4] 1 2 3 4
map.forEach( (k,v)->{。。。。} );
1 Map<String, Integer> map = new HashMap<String, Integer>(); 2 map.put("辽宁", 55); 3 map.put("李宁", 46); 4 map.put("苏宁", 64); 5 map.put("狗宁", 75); 6 map.put("离宁", 25); 7 System.out.println(map); 8 9 map.forEach((k,v)->{System.out.println(k+" "+v);});
//输出结果为 {苏宁=64, 狗宁=75, 辽宁=55, 离宁=25, 李宁=46} 苏宁 64 狗宁 75 辽宁 55 离宁 25 李宁 46