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));
- }
- }