Java 8十个lambda表达式案例

  1. 实现Runnable线程案例

使用() -> {} 替代匿名类:

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

你可以使用 下面语法实现Lambda:

(params) -> expression

(params) -> statement

(params) -> { statements }

如果你的方法并不改变任何方法参数,比如只是输出,那么可以简写如下:

() -> System.out.println("Hello Lambda Expressions");

如果你的方法接受两个方法参数,如下:

(int even, int odd) -> even + odd

2.实现事件处理

如果你曾经做过Swing 编程,你将永远不会忘记编写事件侦听器代码。使用lambda表达式如下所示写出更好的事件侦听器的代码。

  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("without lambda expression is boring");
  7. }
  8. });
  9.  
  10. // Java 8 way:
  11. show.addActionListener((e) -> {
  12. System.out.println("Action !! Lambda expressions Rocks");
  13. });

在java 8中你可以使用Lambda表达式替代丑陋的匿名类。

3.使用Lambda表达式遍历List集合

  1. //Prior Java 8 :
  2. List features = Arrays.asList("Lambdas", "Default Method",
  3. "Stream API", "Date and Time API");
  4. for (String feature : features) {
  5. System.out.println(feature);
  6. }
  7.  
  8. //In Java 8:
  9. List features = Arrays.asList("Lambdas", "Default Method", "Stream API",
  10. "Date and Time API");
  11. features.forEach(n -> System.out.println(n));
  12.  
  13. // Even better use Method reference feature of Java 8
  14. // method reference is denoted by :: (double colon) operator
  15. // looks similar to score resolution operator of C++
  16. features.forEach(System.out::println);
  17.  
  18. Output:
  19. Lambdas
  20. Default Method
  21. Stream API
  22. Date and Time API

方法引用是使用两个冒号::这个操作符号。

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

为了支持函数编程,Java 8加入了一个新的包java.util.function,其中有一个接口java.util.function.Predicate是支持Lambda函数编程:

  1. public static void main(args[]){
  2. List languages = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp");
  3.  
  4. System.out.println("Languages which starts with J :");
  5. filter(languages, (str)->str.startsWith("J"));
  6.  
  7. System.out.println("Languages which ends with a ");
  8. filter(languages, (str)->str.endsWith("a"));
  9.  
  10. System.out.println("Print all languages :");
  11. filter(languages, (str)->true);
  12.  
  13. System.out.println("Print no language : ");
  14. filter(languages, (str)->false);
  15.  
  16. System.out.println("Print language whose length greater than 4:");
  17. filter(languages, (str)->str.length() > 4);
  18. }
  19.  
  20. public static void filter(List names, Predicate condition) {
  21. for(String name: names) {
  22. if(condition.test(name)) {
  23. System.out.println(name + " ");
  24. }
  25. }
  26. }
  27. }
  28.  
  29. Output:
  30. Languages which starts with J :
  31. Java
  32. Languages which ends with a
  33. Java
  34. Scala
  35. Print all languages :
  36. Java
  37. Scala
  38. C++
  39. Haskell
  40. Lisp
  41. Print no language :
  42. Print language whose length greater than 4:
  43. Scala
  44. Haskell
  45.  
  46. //Even better
  47. public static void filter(List names, Predicate condition) {
  48. names.stream().filter((name) -> (condition.test(name)))
  49. .forEach((name) -> {System.out.println(name + " ");
  50. });
  51. }

你能看到来自Stream API 的filter方法能够接受 Predicate参数, 能够允许测试多个条件。

5.复杂的结合Predicate 使用

java.util.function.Predicate提供and(), or() 和 xor()可以进行逻辑操作,比如为了得到一串字符串中以"J"开头的4个长度:

  1. // We can even combine Predicate using and(), or() And xor() logical functions
  2. // for example to find names, which starts with J and four letters long, you
  3. // can pass combination of two Predicate
  4. Predicate<String> startsWithJ = (n) -> n.startsWith("J");
  5. Predicate<String> fourLetterLong = (n) -> n.length() == 4;
  6.  
  7. names.stream()
  8. .filter(startsWithJ.and(fourLetterLong))
  9. .forEach((n) -> System.out.print("\nName, which starts with
  10. 'J' and four letter long is : " + n));

其中startsWithJ.and(fourLetterLong)是使用了AND逻辑操作。

6.使用Lambda实现Map 和 Reduce

最流行的函数编程概念是map,它允许你改变你的对象,在这个案例中,我们将costBeforeTeax集合中每个元素改变了增加一定的数值,我们将Lambda表达式 x -> x*x传送map()方法,这将应用到stream中所有元素。然后我们使用 forEach() 打印出这个集合的元素.

  1. // applying 12% VAT on each purchase
  2. // Without lambda expressions:
  3. List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
  4. for (Integer cost : costBeforeTax) {
  5. double price = cost + .12*cost;
  6. System.out.println(price);
  7. }
  8.  
  9. // With Lambda expression:
  10. List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
  11. costBeforeTax.stream().map((cost) -> cost + .12*cost)
  12. .forEach(System.out::println);
  13.  
  14. Output
  15. 112.0
  16. 224.0
  17. 336.0
  18. 448.0
  19. 560.0
  20. 112.0
  21. 224.0
  22. 336.0
  23. 448.0
  24. 560.0

reduce() 是将集合中所有值结合进一个,Reduce类似SQL语句中的sum(), avg() 或count(),

  1. // Applying 12% VAT on each purchase
  2. // Old way:
  3. List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
  4. double total = 0;
  5. for (Integer cost : costBeforeTax) {
  6. double price = cost + .12*cost;
  7. total = total + price;
  8.  
  9. }
  10. System.out.println("Total : " + total);
  11.  
  12. // New way:
  13. List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
  14. double bill = costBeforeTax.stream().map((cost) -> cost + .12*cost)
  15. .reduce((sum, cost) -> sum + cost)
  16. .get();
  17. System.out.println("Total : " + bill);
  18.  
  19. Output
  20. Total : 1680.0
  21. Total : 1680.0

7.通过filtering 创建一个字符串String的集合

Filtering是对大型Collection操作的一个通用操作,Stream提供filter()方法,接受一个Predicate对象,意味着你能传送lambda表达式作为一个过滤逻辑进入这个方法:

  1. // Create a List with String more than 2 characters
  2. List<String> filtered = strList.stream().filter(x -> x.length()> 2)
  3. .collect(Collectors.toList());
  4. System.out.printf("Original List : %s, filtered list : %s %n",
  5. strList, filtered);
  6.  
  7. Output :
  8. Original List : [abc, , bcd, , defg, jk], filtered list : [abc, bcd, defg]

8.对集合中每个元素应用函数

我们经常需要对集合中元素运用一定的功能,如表中的每个元素乘以或除以一个值等等.

  1. // Convert String to Uppercase and join them using coma
  2. List<String> G7 = Arrays.asList("USA", "Japan", "France", "Germany",
  3. "Italy", "U.K.","Canada");
  4. String G7Countries = G7.stream().map(x -> x.toUpperCase())
  5. .collect(Collectors.joining(", "));
  6. System.out.println(G7Countries);
  7.  
  8. Output :
  9. USA, JAPAN, FRANCE, GERMANY, ITALY, U.K., CANADA

上面是将字符串转换为大写,然后使用逗号串起来。

9.通过复制不同的值创建一个子列表

使用Stream的distinct()方法过滤集合中重复元素。

  1. // Create List of square of all distinct numbers
  2. List<Integer> numbers = Arrays.asList(9, 10, 3, 4, 7, 3, 4);
  3. List<Integer> distinct = numbers.stream().map( i -> i*i).distinct()
  4. .collect(Collectors.toList());
  5. System.out.printf("Original List : %s, Square Without duplicates :
  6. %s %n", numbers, distinct);
  7.  
  8. Output :
  9. Original List : [9, 10, 3, 4, 7, 3, 4], Square Without
  10. duplicates : [81, 100, 9, 16, 49]

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

  1. //Get count, min, max, sum, and average for numbers
  2. List<Integer> primes = Arrays.asList(2, 3, 5, 7, 11, 13, 17, 19, 23, 29);
  3. IntSummaryStatistics stats = primes.stream().mapToInt((x) -> x)
  4. .summaryStatistics();
  5. System.out.println("Highest prime number in List : " + stats.getMax());
  6. System.out.println("Lowest prime number in List : " + stats.getMin());
  7. System.out.println("Sum of all prime numbers : " + stats.getSum());
  8. System.out.println("Average of all prime numbers : " + stats.getAverage());
  9.  
  10. Output :
  11. Highest prime number in List : 29
  12. Lowest prime number in List : 2
  13. Sum of all prime numbers : 129
  14. Average of all prime numbers : 12.9

lambda表达式快速创建的更多相关文章

  1. 采用Lambda表达式快速实现实体模型对象转换到DTO

    在项目中,采用code first时建立的模型对象不能直接用于数据传输,需要从新根据需求建立Dto对象 为什么需要建立Dto对象呢? DTO即数据传输对象.之前不明白有些框架中为什么要专门定义DTO来 ...

  2. 通过编译lambda表达式来创建实例(可在反射时候用,效率比反射高一些)

    原文地址:https://rogerjohansson.blog/2008/02/28/linq-expressions-creating-objects/ 据说编译lambda创建实例是比反射快.实 ...

  3. 【python021-函数lambda表达式】

    一.匿名函数 1.lambda表达式 >>> g = lambda x:x*2+1>>> g(5)11>>> ---冒号前面的x是函数的参数,冒号 ...

  4. java8特性之Lambda表达式

    1.典型的用Lambda表达式的场景 如果有这样的一个小应用,其中的一个类Student包含姓名(name),性别(sex),分数(score),如下: package demo; public cl ...

  5. 零基础入门学习Python(21)--函数:lambda表达式

    知识点 lambda 表达式 Python 允许使用lambda关键字创建匿名函数 lambda 函数怎么使用? 单个参数 >>> def add(x): return 2*x + ...

  6. Lambda表达式(一)入门认识篇

    Lambda表达式(一)入门认识篇 Lambda简介 Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极 ...

  7. Util应用程序框架公共操作类(九):Lambda表达式扩展

    上一篇对Lambda表达式公共操作类进行了一些增强,本篇使用扩展方法对Lambda表达式进行扩展. 修改Util项目的Extensions.Expression.cs文件,代码如下. using Sy ...

  8. Java8之——简洁优雅的Lambda表达式

    Java8发布之后,Lambda表达式,Stream等等之类的字眼边慢慢出现在我们字眼.就像是Java7出现了之后,大家看到了“钻石语法”,看到了try-with-resource等等.面对这些新东西 ...

  9. [.net 面向对象程序设计进阶] (5) Lamda表达式(一) 创建委托

    [.net 面向对象程序设计进阶] (5) Lamda表达式(一)  创建委托 本节导读: 通过学习Lambda表达式,学会创建委托和表达式目录树,深入了解Lambda的特性,让你的代码变的更加清晰. ...

随机推荐

  1. testNG安装与使用

    1.Eclipse集成TestNG插件 a.下载TestNG离线插件并解压得到features和plugins两个文件夹: b.将features文件下的org.testng.eclipse_6.9. ...

  2. MySQL之DDL数据定义语言:库、表的管理

    库的管理 常用命令 #创建库 create database if not exists 库名 [ character set 字符集名]; create database if not exists ...

  3. JAVA POI导出EXCEL 动态表头、多级表头、动态数据

    导出Excel文件是业务中经常遇到的需求,以下是经常遇到的一些问题: 1,导出中文文件名乱码 String filename = "sheet1";response.setChar ...

  4. Failed to start connector [Connector[HTTP/1.1-8080]]

    错误提示:Failed to start connector [Connector[HTTP/1.1-8080]]错误原因:Tomcat端口被占用解决方案(window下):1.cmd打开命令控制台2 ...

  5. 设计模式学习-使用go实现观察者模式

    观察者模式 定义 适用场景 优点 缺点 代码实现 不同场景的实现方式 观察模式和发布订阅模式 参考 观察者模式 定义 观察者模式(Observer Design Pattern)定义了一种一对多的依赖 ...

  6. MySQL5.5.33对应的JDBC驱动包怎样使用?

    双击msi文件就会自动安装,然后找到安装路径下的jar,并把它加到类路径下,如手动编译和执行时javac -classpath c:\program files\...\mysql.jar;... m ...

  7. C#中指针的使用(转)

    在C#中,有时候希望通过指针来操作内存,这样可以提高效率.我们可以用unsafe关键字修饰含有指针操作的程序段,如下所示: class Program {   static int Main(stri ...

  8. java 后台通过IO流把文件传到前端并下载

    我的业务需求是两个不同的web程序放在不同的服务器上,web程序A要访问到web程序B上传上来的文件,所以用到了这一个IO读取文件的接口 JAVA代码(排版有点问题  已经尽力补救了(:3_ヽ)_) ...

  9. Devs--开源规则引擎介绍

    Devs Devs是一款轻量级的规则引擎. 开源地址:https://github.com/CrankZ/devs 基础概念 此规则引擎的基础概念有字段.条件.规则等. 其中字段组成条件,条件组成规则 ...

  10. [NOI2021] 量子通信

    嗯. NOI2021最白给的一题. PS:很后悔没打同步赛,少了一张同步赛Ag 考虑加黑的256位01串,我们思考一下. 因为\(k\)小于16,所以我们直接分成16块.所以一定可以的绝对有一块是完全 ...