首页 > Java8中Lambda表达式的10个例子

Java8中Lambda表达式的10个例子

Java8中Lambda表达式的10个例子 

例1 用Lambda表达式实现Runnable接口 

Java代码  收藏代码
  1. //Before Java 8:  
  2. new Thread(new Runnable() {  
  3. @Override  
  4. public void run() {  
  5.     System.out.println("Before Java8, too much code for too little to do");  
  6. }  
  7. }).start();  
  8. //Java 8 way:  
  9. new Thread( () -> System.out.println("In Java8, Lambda expression rocks !!") ).start();  





输出: 

too much code, for too little to do 

Lambda expression rocks !! 

这个例子使我们学到了java8中Lambda表达式的书写方式: 

(参数) -> 表达式 

(参数) -> 语句 

(参数) -> { 语句 } 

例如,如果你的方法只是在控制台打印信息,则可以这么写: 

Java代码  收藏代码
  1. () -> System.out.println("Hello Lambda Expressions");  



如果你的方法接收两个参数,那么: 

Java代码  收藏代码
  1. (int even, int odd) -> even + odd  



顺带提一句,一般来说在Lambda表达式中要尽量保持变量的简洁性。这会使你的代码简短而能保持在一行之内。所以像上面的代码可以选择变量名类似a,b或者x,y之类的,比起even和odd来会更好。 



例2 用Lambda表达式写事件监听程序 

要是你用过Swing API,那就少不了事件监听代码,这是使用匿名类的经典例子。现在我们可以用Lambda表达式来抒写更好的事件处理代码。 

Java代码  收藏代码
  1. // Before Java 8:  
  2. JButton show = new JButton("Show");  
  3. show.addActionListener(new ActionListener() {  
  4.     @Override  
  5.     public void actionPerformed(ActionEvent e) {  
  6.         System.out.println("Event handling without lambda expression is boring");  
  7.     }  
  8. });  
  9. // Java 8 way:  
  10. show.addActionListener((e) -> {  
  11.     System.out.println("Light, Camera, Action !! Lambda expressions Rocks");  
  12. });  



另外一个常用匿名类的地方是给Collections.sort()方法提供自定义的Comparator接口实现。这个地方也可以用Lambda表达式。 



例3 用Lambda表达式进行List迭代 

Java代码  收藏代码
  1. //Prior Java 8 :  
  2. List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");  
  3. for (String feature : features) {  
  4.     System.out.println(feature);  
  5. }  
  6. //In Java 8:  
  7. List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");  
  8. features.forEach(n -> System.out.println(n));  



// 用java8的方法引用更好,方法引用由::(双冒号)操作符来完成,看起来像c++中的作用域操作符 

Java代码  收藏代码
  1. features.forEach(System.out::println);  



输出: 

Lambdas 

Default Method 

Stream API 

Date and Time API 



例4 使用Lambda表达式和函数式接口Predicate 

除了提供函数式编程语言级别的支持外,java8同时也新增了一个新的包java.util.function。其中包含了许多类来支持java函数式编程。其中之一是Predicate接口,使用这个接口和lamb表达式就可以以更少的代码为API方法添加更多的动态行为。 

以下是Predicate的使用范例,展示了过滤集合数据的许多共性。 

Java代码  收藏代码
  1. public static void main(args[]){  
  2.     List languages = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp");  
  3.     System.out.println("Languages which starts with J :");  
  4.     filter(languages, (str)->str.startsWith("J"));  
  5.     System.out.println("Languages which ends with a ");  
  6.     filter(languages, (str)->str.endsWith("a"));  
  7.     System.out.println("Print all languages :");  
  8.     filter(languages, (str)->true);  
  9.     System.out.println("Print no language : ");  
  10.     filter(languages, (str)->false);  
  11.     System.out.println("Print language whose length greater than 4:");  
  12.     filter(languages, (str)->str.length() > 4);  
  13. }  
  14. public static void filter(List names, Predicate condition) {  
  15.     for(String name: names) {  
  16.         if(condition.test(name)) {  
  17.             System.out.println(name + " ");  
  18.         }  
  19.     }  
  20. }  



输出: 

Languages which starts with J : 

Java 

Languages which ends with a 

Java 

Scala 

Print all languages : 

Java 

Scala 

C++ 

Haskell 

Lisp 

Print no language : 

Print language whose length greater than 4: 

Scala 

Haskell 

Java代码  收藏代码
  1. //更佳的方式  
  2. public static void filter(List names, Predicate condition) {  
  3.     names.stream().filter((name) -> (condition.test(name))).forEach((name) -> {  
  4.         System.out.println(name + " ");  
  5.     });  
  6. }  



可以看到Stream API的filter方法也接受一个Predicate,意味着可以用内联代码直接替换我们自定义的filter()方法。这就是Lambda表达式的威力所在。除此之外Predicate接口也可以测试多个条件,将会在下面的例子中加以说明。



例5: Lambda表达式结合Predicate 

就像上个例子所说,Predicate允许组合两个以上的条件,它提供了类似于逻辑与和或的操作and(),or()和xor(),这些方法可以用来组合传递到filter方法中的多个条件。例如为了获取所有以J开头并有四个字符长度的语言,可以定义两个单独的Predicate实例覆盖每个条件然后用and方法将他们组合在一起。看例子: 

Java代码  收藏代码
  1. Predicate startsWithJ = (n) -> n.startsWith("J");  
  2. Predicate fourLetterLong = (n) -> n.length() == 4;  
  3. names.stream().filter(startsWithJ.and(fourLetterLong)).forEach((n) -> System.out.print(" Name, which starts with 'J' and four letter long is : " + n));  



类似可以用or或者xor。这个例子也强调了单独用或者按需组合用Predicate的重要性。简而言之用Predicate和Lambda表达式的优势你可以写的更少做得更多。 



例6 Map和Reduce的例子 

6.1 Map 

在这个例子中,我们要将costBeforeTax的每个元素以加上他们的增值税。传递一个Lambda表达式给map方法使之应用于每个元素,之后在用forEach打印结果。 

Java代码  收藏代码
  1. // Without lambda expressions:  
  2. List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);  
  3. for (Integer cost : costBeforeTax) {  
  4.     double price = cost + .12*cost;  
  5.     System.out.println(price);  
  6. }   
  7. // With Lambda expression:  
  8. List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);  
  9. costBeforeTax.stream().map((cost) -> cost + .12*cost).forEach(System.out::println);  



输出 

112.0 

224.0 

336.0 

448.0 

560.0 

112.0 

224.0 

336.0 

448.0 

560.0 

6.2 Reduce 

还有另外一个函数reduce可以将所有值转换为一个值。map跟reduce操作是函数式编程的核心,reduce也被称作折叠操作。reduce并不是一种新的操作,在SQL中我们用的一些聚集函数比如sum,avg,count等他们实际上也是reduce操作,因为他们也是将多个值进行操作然后返回一个值。Stream API定义了reduce函数,可以接受一个Lambda表达式然后组合所有值。Stream类中像IntStream都有内置的方法像average(), count(), sum(), mapToLong(), mapToDouble()等转换方法。我们可以用内置的方法也可以自定义。 

Java代码  收藏代码
  1. // Old way:  
  2. List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);  
  3. double total = 0;  
  4. for (Integer cost : costBeforeTax) {  
  5.     double price = cost + .12*cost;  
  6.     total = total + price;  
  7. }  
  8. System.out.println("Total : " + total);  
  9. // New way:  
  10. List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);  
  11. double bill = costBeforeTax.stream().map((cost) -> cost + .12*cost).reduce((sum, cost) -> sum  
  12. + cost).get();  
  13. System.out.println("Total : " + bill);  



输出 

Total : 1680.0 

Total : 1680.0 



例7 用filter创建一个字符串List 

在java开发中对大的集合进行过滤是常用的操作。用Lambda表达式和Stream API会让操作变得简单易懂。 

Stream提供了一个filter()方法,接受一个Predicate对象。这意味着可以传递一个Lambda表达式作为过滤逻辑,看例子: 

Java代码  收藏代码
  1. //创建一个长度大于两个字符的字符串List  
  2. List filtered = strList.stream().filter(x -> x.length()>  
  3. 2).collect(Collectors.toList());  
  4. System.out.printf("Original List : %s, filtered list : %s %n", strList, filtered);  



输出 : 

Original List : [abc, , bcd, , defg, jk], filtered list : [abc, bcd, defg] 



例8 给每个List元素应用函数 

在工作中我们经常会碰到这样的情况:给List中每个元素加以一定的操作例如乘以或者除以某个值等。这些操作用map方法再好不过了,我们可以将转换逻辑以Lambda表达式传给map方法来应用于每个元素: 

//将字符串转为大写然后用逗号连起来 

Java代码  收藏代码
  1. List G7 = Arrays.asList("USA", "Japan", "France", "Germany", "Italy","U.K.","Canada");  
  2. String G7Countries = G7.stream().map(x -> x.toUpperCase()).collect(Collectors.joining(", "));  
  3. System.out.println(G7Countries);  



输出: 

USA, JAPAN, FRANCE, GERMANY, ITALY, U.K., CANADA 



例9 复制不同值到子列表 

本例演示如何利用Stream类的distinct方法过滤重复值到集合中。 

Java代码  收藏代码
  1. List numbers = Arrays.asList(9, 10, 3, 4, 7, 3, 4);  
  2. List distinct = numbers.stream().map( i ->i*i).distinct().collect(Collectors.toList());  
  3. System.out.printf("Original List : %s, Square Without duplicates : %s %n", numbers, distinct);  



输出 : 

Original List : [9, 10, 3, 4, 7, 3, 4], Square Without duplicates : [81, 100, 9, 16, 49] 



例10 计算List中元素的最大,最小,和以及平均值 

在Stream类中像IntStream, LongStream and DoubleStream有一个非常有用的方法summaryStattics(),返回IntSummaryStatistics, LongSummaryStatistics or DoubleSummaryStatistics其描述了这个流中元素的统计数据。下面的例子中我们用这个方法来计算一个List中的最大最小值总和以及均值: 

Java代码  收藏代码
  1. List primes = Arrays.asList(2, 3, 5, 7, 11, 13, 17, 19, 23, 29);  
  2. IntSummaryStatistics stats = primes.stream().mapToInt((x) -> x).summaryStatistics();  
  3. System.out.println("Highest prime number in List : " + stats.getMax());  
  4. System.out.println("Lowest prime number in List : " + stats.getMin());  
  5. System.out.println("Sum of all prime numbers : " + stats.getSum());  
  6. System.out.println("Average of all prime numbers : " + stats.getAverage());  



输出: 

Highest prime number in List : 29 

Lowest prime number in List : 2 

Sum of all prime numbers : 129 

Average of all prime numbers : 12.9

转载于:https://www.cnblogs.com/zkycode/p/6251488.html

更多相关:

  • list_for_each_safeBidirect-list list_for_each_safe().https://biscuitos.github.io/blog/LIST_list_for_each_safe/...

  • /*hanzhiguang coded at 2009.07.30 1:20*/ // nesting_map.cpp : Defines the entry point for the console application. // /*-----------------------------------------------...

  • 已知k个已排序链表头节点指针,将这k个链表合并,合并后仍为有序的 ,返回合并后的头节点 如下三个链表: 合并后的结果如下: 方法一(STL sort算法进行排序): 先将输入的排序链表插入一个迭代器中,vector数组中国呢直接对数组中的链表节点进行按值排序即可 实现算法如下,最终实现源码见文末: bool cmp(Dat...

  • 本题要求实现一个函数,找到并返回链式表的第K个元素。 函数接口定义: ElementType FindKth( List L, int K ); 其中List结构定义如下: typedef struct LNode *PtrToLNode; struct LNode {ElementType Data;PtrToLNode Ne...

  • 一、前述 企业中linux搭建ftp服务器还是很实用的,所以本文针对centoos7和centoos6搭建服务器教程做个总结。 二、具体 1、显示如下图则表示已安装 vsftp软件。如果未显示则需要安装vsftpd软件。 如果没有则通过yarm源进行安装 yum install -y vsftpd 2、安装完成之后 进入到ftp的根...

  • 我们接触过java需要的小伙伴们都知道java是一门强大而又复杂的编程语言,现如今在互联网行业,java的身影随处可见,可能刚学习的小伙伴们会被java语言庞大的体系图吓到,不过知识毕竟是一个积累的过程,接下来对于新手来说,看看哪些是java程序员必学的内容吧。1:html,html−超文本标记语言,这是用来在浏览器上生成用户所看到的...

  • Java工程师数量日益增长,而其薪资不降反升几十年来,Java比其他语言更常名列榜首2019年,Java仍然是最流行的编程语言Java工程师的薪资到底多高?据职友集数据,近一年,全国Java工程师的平均薪资为13400元。然而在右边的投票中,竟有67%的人觉得月薪13400元偏低、偏低、偏低~为了探个究竟,小编特意去招聘网站查询了当下...

  • 因为工作需要使用到ActiveMQ,它是Java语言实现的,所以需要事先安装Java集成环境,下面是我的实操过程,记录如下,参考了文末两篇链接。 一、系统环境说明 rMBP上的VMware Fushion Pro 10.1.1 CentOS 6.9 64bit jdk-8u211-linux-x64.tar.gz 二、安装步骤...

  • 这周基本学完了java的基础中的基础,还不会灵活的应用,相关概念仍然有些模糊。为此,自己将自己学到的知识点做了下系统的复习,并作了相关的笔记。这周编程的大部分时间主要用于小学期PTA的编程作业中(用C++语言),练习java做的比较少,所以现在敲java代码的时候仍然感觉不太熟练,有时候相关的函数引入还要想一下,并且这次发现自己观看...

  • 本周对java的循坏结构和条件语句以及switch分支进行了复习并通过九九乘法表和制作日历来更加熟练使用和理解循环,并用eclipse替代了记事本来编写程序,同时针对记事本编写java程序后台运行出现的GBK不可映射字符问题先后采用了 javac  -encoding  UTF-8  xxx.java进行编译和采用notepad++...

  • 如果你只是想对流经该层的数据做个变换,而这个变换本身没有什么需要学习的参数,那么直接用Lambda Layer是最合适的了。 导入的方法是 from keras.layers.core import Lambda Lambda函数接受两个参数,第一个是输入张量对输出张量的映射函数,第二个是输入的shape对输出的shape的映...

  • 或许,Lambda 表达式算得上是 C++ 11 新增特性中最激动人心的一个。这个全新的特性听起来很深奥,但却是很多其他语言早已提供(比如 C#)或者即将提供(比如 Java)的。简而言之,Lambda 表达式就是用于创建匿名函数的。GCC 4.5.x 和 Microsoft Visual Studio 早已提供了对 lambda 表...

  • 动态规划中的巴拿赫不动点定理5. Banach Fixed Point Theorem in Dynamic Programming5.1 巴拿赫不动点定理定理 (Banach fixed point theorem)定义 5.1 度量空间定义定义 5.2 压缩映射Lemma 5.1 基本压缩不等式 (Fundamental cont...

  • from functools import reducedi = {}di.update(zip('1234567890.', [1,2,3,4,5,6,7,8,9,0,'.'])) def str2float(s):   st = s.split('.')   st1 = reduce(lambda x,y: 10*x + y, m...

  • lambda 语法: lambda [arg1[,arg2,arg3....argN]]:expression 1.单个参数的: g = lambda x:x*2 print g(3) 结果是6 2.多个参数的: m = lambda x,y,z: (x-y)*z print m(3,1,2) 结果是4 3.无参数 # 使用...