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. jmeter压测IP欺骗绕过服务端限流

    1.环境声明 jmeter3.0 后端为内网环境 2.检查内网闲置的ip 工具地址,无需复杂安装,解压点击就可以用啦~~ https://pan.baidu.com/s/1Yzs1vezfFMoy-m ...

  2. 【CVE-2020-1948】Apache Dubbo Provider反序列化漏洞复现

    一.实验简介 实验所属系列: 系统安全 实验对象:本科/专科信息安全专业 相关课程及专业: 计算机网络 实验时数(学分):2 学时 实验类别: 实践实验类 二.实验目的 Apache Dubbo是一款 ...

  3. 本地以sysdba 身份登录数据库实例时,报错ORA-01031 权限不足

    在linux 操作系统的数据库服务器上,使用"sqlplus / as sysdba" 登录Oracle 10.2 数据库实例时,登录失败,显示ORA-01031:  权限不足. ...

  4. ofd文件电子签章实现方法

    前言 文档处理一般经过三个环节:流.版.签:流式软件负责编辑,如:office.wps等.版式软件负责文档定型,保证显示样式不跑偏:版式文件格式有两种:pdf.ofd.签章软件负责对版式文档签章.签章 ...

  5. python-文件操作(一)

    目录 文件操作 1.什么是文件? 2.操作文件的方法: 3.路径分类: 4.如何取消特殊字符的功能: 5.对文件的操作有:读.写.追加内容 6.with上下文管理 7.文件操作方法详细: 1.r-读操 ...

  6. C#-WPF数据绑定基础(一)

    前言:WPF数据绑定技术有效的提高了程序的容错率,可以最大程度的保持程序的健壮性,从而降低程序在使用过程中崩掉的可能性. 接下来,我将分享一下我在写测量程序过程中所用到的数据绑定方面的知识 首先,我所 ...

  7. [atARC121D]1 or 2

    对于大小为1的集合,我们可以在其中加入0 因此,枚举0的个数,那么问题即可以看作要求每一个集合大小为2 (特别的,我们允许存在$\{0,0\}$,因为这样删除这两个0显然只会减小极差) 显然此时贪心将 ...

  8. 干掉idea视图黄色警告

    最近在写jsp代码黄色很烦人,安装codeglance插件小地图感觉也是很不舒服 ,百度了一下可以取消警告: https://blog.csdn.net/qq_40634961/article/det ...

  9. CSS动画--让div动起来

    CSS动画 今天在写代码时候,遇到了css动画效果如何实现的问题,经过查阅和实践,总结出一下结论. transition transition 指定动画变化的对应属性 以及动画的执行时间. 例如:tr ...

  10. 『学了就忘』Linux权限管理 — 54、sudo授权

    目录 1.什么是sudo授权 2. sudo授权说明 3.sudo命令的使用 示例1 示例2 示例3 1.什么是sudo授权 在Linux系统中,/sbin/和/usr/sbin/两个目录中的命令只有 ...