装饰网站建设套餐报价,wordpress 网页慢,用dw6做网站,江门企业网站建设公司Java8中一个非常重要的特性就是Lambda表达式#xff0c;我们可以把它看成是一种闭包#xff0c;它允许把函数当做参数来使用#xff0c;是面向函数式编程的思想#xff0c;一定程度上可以使代码看起来更加简洁。 
其实以上都不重要#xff0c;重要的是能够提高我的开发效率…Java8中一个非常重要的特性就是Lambda表达式我们可以把它看成是一种闭包它允许把函数当做参数来使用是面向函数式编程的思想一定程度上可以使代码看起来更加简洁。 
其实以上都不重要重要的是能够提高我的开发效率为了工作效率避免无意义加班使用Lambda表达式只能说好爽一时用一时爽一直用一直爽但是学习可能很多人觉得很复杂于是放弃了可读性确实很不好我的建议是死记规则学习常用的Lambda表达式就够了。因为其他稀奇古怪的语法很可能被你老大看见了会请你喝茶所以本篇博客就由浅入深介绍提高工作效率神器——Lambda常用表达式。 
例子切入 
比如创建一个线程并启动一般我们这样写 
//匿名内部类写法
new Thread(new Runnable() {Overridepublic void run() {System.out.println(内部类写法);}
}).start();使用Lambda表达式可以这样写 
new Thread(() - System.out.println(hello world)).start();我知道你很急但你先别急后面我们详细介绍其用法。以上代码表明使用Lambda表达式写起来真的很爽早写完早下班如果你司是代码量绩效那别学了先辞职再说[手动狗头] 
使用场景 
Lambda表达式的最最最常见的使用场景是 接口和容器凡是以后需要实现接口和操作容器都可以考虑使用Lambda表达式。实现接口需要注意如果接口中仅有一个抽象方法需要实现可以使用Lambda表达式否则有多个未实现的方法不能使用。上述例子也就是接口使用Lambda表达式的一种实现方式。下面分为接口和容器结合例子进行讲解。 
接口 
首先定义我们自己的接口就是打印输入的字符串s如下 
interface MyPrint{public void print(String s);
}传统的实现方式就是需要实现MyPrint类然后重写print方法这里就不再展示我们直接使用Lambda表达式实现如下 
MyPrint myPrint  s - System.out.println(s);
myPrint.print(hello world 1);现在解释上述代码等号左边是我们的接口类使用多态的方式父类引用指向子类实现。那么右边就是我们对左边父类的实现。() - {} 是Lambda的一个语法()中的字符表示需要传入的参数不需要写类型使用占位符即可如果()中没有参数表示该方法指的是需要重写的方法无参。{} 是方法体具体的实现代码写在 {} 中。如果有多个参数可以写成 (a,b)-{return ab} 但是这还不够简介记住如果(a)只有一个参数那么不需要写 () 直接写 a如果 {} 只有一行代码如果有return则不用写 return 也不用写 {}就写出一行需要返回的逻辑实现即可例如上面代码实现标准写法是: 
MyPrint myPrint  (s) - {System.out.println(s)};总结就是能偷懒就偷懒()-{} 出错那你就按照标准的语法写反正编译器会告诉你如果只有一个参数可以省略() 如果方法体只有一行代码可以省去return 单词和{} 。是不是超级简单那么下面要升级难度了 上述写法还可以进一步写成如下 
MyPrint myPrint  System.out::println; //等价于 s - System.out.println(s);
myPrint.print(hello world 2);这里就不得不介绍 :: 号的用法了我们放到下一节讲解 
双冒号 :: 的用法 
对于 :: 我的理解如下假设有个Student类其中有个方法 getName() 那么student::getName 的意思就是 传入Student的对象student调用它的getName()方法。等价于 (Student s)-{s.getName()} , 即 
student::getName   等价于  (s)-{s.getName()} 或者  (Student s)-{s.getName()} 所以System.out::println 双冒号左边是对象右边是该对象的方法。那有人会问那么参数s如何传的呢我们再看System.out::println; 等价于 s - System.out.println(s); 其实println需要的是一个字符串参数而MyPrint的print接口也是一个字符串参数这种一对一的参数传递其实是隐式传递的而且如果使用这种写法参数必须是对应的 
以上情况是 对象::实例方法名 那么也可以有 类名::静态方法名例如 Integer::parseInt 就是接受一个字符串解析为整数。等价于 (String s)-{ Integer.parseInt(s)}。你会问你怎么知道参数是String因为parseInt方法需要的就是String 啊。因此如果你明白啦以上的规则其实非常简单现在还不适应没关系通过下面的容器集合流处理案例你会很明白 
Java 容器集合的Lambda用法 
这里就非常简单了基本都是Stream流的处理配合Lambda表达式简直写起来不要太爽了这里还是以语法结合案例为驱动来讲解 
forEach 语法 
使用它替代 for(int a : arr) 简直太爽了如下 // 使用Lambda表达式替代for循环ListInteger arr  Arrays.asList(4, 1, 25);// forEach 表示从容器中依次取出每个元素进行{}中的操作arr.forEach(num-{int tmp  num1;System.out.println(tmp);});过滤器 stream().filter() 
对容器中每个对象都进行过滤如果filter( lambda条件)中的条件判断为true则保留条件为false则丢弃。案例提取容器中的奇数数字。 
ListInteger arr  Arrays.asList(4, 1, 25,3,6);
ListInteger o  arr.stream().filter(num - num % 2  1).collect(Collectors.toList());
System.out.println(o);.collect(Collectors.toList() 表示重新转为List容器。 
映射器 stream().map() 
对容器中的每个对象都遍历并对它在 map( lambda操作 ) 中进行一个Lambda表达式的操作例子每个数字变成自身的2倍使用forEach也可以实现 
ListInteger arr  Arrays.asList(4, 1, 25,3,6);
ListInteger d  arr.stream().map(num - 2 * num).collect(Collectors.toList());
System.out.println(d);groupingBy 分组的使用 
例子将下面数组按照其字符串长度分组。 
ListString phones  Arrays.asList(huawei, xiaomi, vivo, iphone,oppo, laoluo, oneplus);
MapInteger, ListString map  phones.stream().collect(Collectors.groupingBy(String::length));
System.out.println(map);综合练习题 
最后来一道综合练习题请先自己做再看答案 将一个字符串数组其中的字符串对应的奇数取出来再转为整数类型再排序 List list  Arrays.asList(“23”, “4”, “11”, “7”, “3”, “8”, “10”); 应该得到 [3, 7, 11, 23] . 
ListInteger res  list.stream().map(Integer::parseInt).filter(a - a % 2  1).sorted().collect(Collectors.toList());
System.out.println(res);以上就是 提高工作效率但不能提高代码效率的常用Lambda表达式。对你有帮助的话帮忙一键三连点赞-评论-关注