前言

Spring Boot 2.0有很多新的特性,但是这些特性是依赖JDK的版本是jdk 8+才能进行使用的。而JDK1.8给人印象最深刻的变动就是Lambda表达式,使用它设计的代码会更加简洁。当开发者在编写Lambda表达式时,也会随之被编译成一个函数式接口。

另外,关于Lambda的读音正确的是:lan b(m) da(兰亩达)[‘læ;mdə],不过可能我们习惯性读成 lam bu da(兰不大)。

并且,虽然看着很先进,其实Lambda表达式的本质只是一个”语法糖”,由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能。

什么是Lambda表达式?

有的人说:

Lambda表达式是一段可以传递的代码,它的核心思想是将面向对象中的传递数据变成传递行为。

有的人说:

Lambda 表达式,也可称为闭包,Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。

也有的人说:

Lambda表达式,它可以很简洁地表示一个行为或传递代码,现在你可以把Lambda表达式看作匿名功能,它基本上就是没有声明名称的方法,但和匿名类一样,它也可以作为参数传递给一个方法。

简单的理解就是:Lambda表达式是一个匿名函数,Lambda表达式基于数学中的λ演算(λ->α、β)得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数,允许把函数作为一个方法的参数传递到方法中(函数作为参数传递进方法)。

Lambda入门

没有使用Lambda的老方法:

button.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent actionEvent){System.out.println("Action detected");}
});

使用Lambda:

button.addActionListener(() -> { System.out.println("Action detected");
});

不采用Lambda的老方法:

Runnable runnable1=new Runnable(){
@Override
public void run(){System.out.println("Running without Lambda");
}
};

使用Lambda优化内部调用:

Runnable runnable2=()->{System.out.println("Running from Lambda");
};

Lambda运行DEMO

下面是一个比较完整的范例,可以直接copy到eclipse或idea运行

package lambda;import java.util.Arrays;
import java.util.Comparator;
import java.util.List;public class Demo1 {public static void main(String[] args) {String[] languagesStr= {"Vue.js", "Spring Boot",  "Zuul", "Eureka","Spring Cloud",  "Lombok","Lambda"};  List<String> languages=  Arrays.asList(languagesStr);  // 以前的循环方式  System.out.println(">>>以前的循环方式:");for (String language: languages) {  System.out.println(language+ ";");  }  System.out.println(">>>使用 lambda 表达式以及函数操作");// 使用 lambda 表达式以及函数操作(functional operation)  languages.forEach((language) -> System.out.println(language+ "; "));  // 在 Java 8 中使用双冒号操作符(double colon operator)  System.out.println(">>>双冒号操作符System.out::println");languages.forEach(System.out::println);  //匿名内部类根据 name 排序  Arrays.sort(languagesStr, new Comparator<String>() {  @Override  public int compare(String s1, String s2) {  return (s1.compareTo(s2));  }  });  //按照字母大小排列Arrays.sort(languagesStr, (String s1, String s2) -> (s1.compareTo(s2))); List<String> sortLanguages=  Arrays.asList(languagesStr);  System.out.println(">>>languagesStr(Comparator)->"+sortLanguages);// 也可以采用如下形式:  }
}


所以你平时见到简单的一句话,其实是分解拆分成以上一个过程用Lambda来简化。

Lambdas和Streams进阶

Stream是JDK8提供给我们的对于元素集合统一、快速、并行操作的一种方式。

package lambda;public class Person {private String name,job;  private int salary, age;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getJob() {return job;}public void setJob(String job) {this.job = job;}public int getSalary() {return salary;}public void setSalary(int salary) {this.salary = salary;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Person(String name, String job, int age,int salary) {super();this.name = name;this.job = job;this.salary = salary;this.age = age;}  }
package lambda;import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import java.util.stream.Collectors;public class Lambda {public static void main(String[] args) {List<Person> javaProgrammers = new ArrayList<Person>() {  private static final long serialVersionUID = 1L;{  add(new Person("亚瑟", "Java", 43, 20000));  add(new Person("兰陵王", "Java", 23, 15000));  add(new Person("孙尚香", "Java", 33, 18000));  add(new Person("刘备", "Java", 32, 16000));  add(new Person("百里守约", "Java", 22, 12000));  add(new Person("百里玄策", "Java", 27, 19000));  }  };  System.out.println("");  System.out.println(">>>所有JAVA程序员的姓名和年龄:");  javaProgrammers.forEach((p) -> System.out.printf("%s  %d; ", p.getName(), p.getAge()));  System.out.println("");  System.out.println(">>>下面是5个  月薪超过 $1,4000  的JAVA程序员:"); List<Person> sortedJavaProgrammers = javaProgrammers.stream()  .limit(5).filter((p) -> (p.getSalary() > 14000))  .collect(Collectors.toList());sortedJavaProgrammers.forEach((p) -> System.out.printf("姓名: %s , 月薪: %s ;", p.getName(), p.getSalary()));  System.out.println("");  System.out.println(">>>将name拼接成字符串:");  String javeDevStr = javaProgrammers  .stream()  .map(Person::getName)  .collect(Collectors.joining(" ; ")); // 在进一步的操作中可以作为标记(token)     System.out.println("javeDevStr->"+javeDevStr);System.out.println(">>>将name 存放到 Set:");  Set<String> javeDevSet = javaProgrammers  .stream()  .map(Person::getName)  .collect(Collectors.toSet());  System.out.println(">>>将 name 存放到 TreeSet:");  TreeSet<String> javeTreeSet = javaProgrammers  .stream()  .map(Person::getName)  .collect(Collectors.toCollection(TreeSet::new));  }
}

好了,以上就是Lambda表达式的入门教程,有什么疑问或建议可以留言一下。

听过却没玩过Lambda表达式?了解一下相关推荐

  1. python使用函数的优点-Lambda表达式在Python中的优点和缺点

    学过python的人,相信都接触过Lambda表达式.本文就来谈谈Lambda表达式在Python中的优点和缺点.一方面,Lambda函数的减少了代码的行数,方便又简洁.另一方面,Lambda表达式有 ...

  2. 为什么Java需要lambda 表达式?

    Java 为什么会引入lambda ? 在Java8出现之前,如果你想传递一段代码到另一个方法里是很不方便的.你几乎不可能将代码块到处传递,因为Java是一个面向对象的语言,因此你要构建一个属于某个类 ...

  3. Lambda表达式超详细总结

    文章目录 1. 什么是Lambda表达式 2. 为什么使用Lambda表达式 3. Lambda表达式语法 4. 函数式接口 4.1 什么是函数式接口 4.2 自定义函数式接口 4.3 Java内置函 ...

  4. java 8 lambda 表达式的优缺点总结

    最近接触到 lambda 表达式后,发现它基本上可以消灭所有 for 循环,换句话说,所有的 for 循环都能被 lambda 表达式改写. 但我发现,它并不是特别完美的,经过我查阅国内外不少网站的资 ...

  5. Lambda表达式语法及应用

    前言: JDK8后,源码中开始应用Lambda表达式,所以如果想读懂源码的同学学习它是绕不过去的,至于lambda表达式在不在开发中使用,就要看自己的需求啦,他的优点很明显,简洁,非常容易并行计算,提 ...

  6. 【Android-Kotlin】匿名内部类与Lambda 表达式(附RecycleView监听)

    一:匿名内部类 一个Test类,里面 1)1个属性 2)1个方法 a.该方法传递的参数是一个接口对象,目的是在这个方法中可以通过这个对象来调用接口方法 接口对象的接口TestInterFace内部有一 ...

  7. lambda表达式可以用来声明_Lambda 的骚操作,你都get到了没

    点击上方关注,选择设为星标每天分享优质干货 Lambda简介 Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中 ...

  8. Lambda表达式从入门到玩嗨儿~

    Lambda表达式 Java8新引入的语法糖 Lambda表达式*(关于lambda表达式是否属于语法糖存在很多争议,有人说他并不是语法糖,这里我们不纠结于字面表述)*.Lambda表达式是一种用于取 ...

  9. 10个Java 8 Lambda表达式经典示例

    Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表 达式,它将允许我们将行为传到函数里.在J ...

最新文章

  1. jsp中session 失效设置
  2. MYSQL的随机抽取实现方法
  3. 5个拓展潜客的创意方法
  4. why we have to redefine _isRefreshNeeded for oData model
  5. 高低温湿热试验箱使用的注意事项
  6. 网络操作系统课后练习第三章
  7. 惊呆!这辆悍马自己在跑跑跑跑跑跑跑!
  8. homework-06
  9. 分段三次hermite插值python
  10. Java switch 使用枚举类
  11. 数字图像处理(三)图像复原(噪声生成,噪声滤波器,逆滤波,维纳滤波,有约束最小二乘恢复)
  12. IDEA如何新建一个source folder
  13. 利用特性、泛型、反射生成sql操作语句(待修改
  14. 对标金九银十:各大厂最新Java面试真题整理+简历模板
  15. 微信小程序python解析获取用户手机号_微信小程序如何获取用户绑定手机号
  16. 【报告分享】中国消费者洞察报告-领航前所未有(附下载)
  17. C#常用加密解密方法(MD5加密解密)
  18. bootloader 启动过程
  19. Java爬虫Ins博主所有帖子的点赞和评论导出excel
  20. Python爬虫之urllib.request的使用

热门文章

  1. Java Spring Boot 2.0实战Docker容器与架构原理,视频与课件,基于Linux环境...
  2. 通过深度学习从胸部X射线检测肺炎
  3. Vue学习笔记(2) 在html文件中创建Vue实例,并使用http-vue-loader注册单文件组件
  4. 《中国人民解放军文职人员条例》2023版解读
  5. 唯品会JAVA怎么样_Java性能优化指南及唯品会的实战
  6. AE制作Json动画教程
  7. java计算机毕业设计宿迁学院学生设计作品交流网站源代码+数据库+系统+lw文档
  8. 如何用python写一个文件管理程序
  9. 亿腾医药再冲刺赴港上市:有六种核心产品,上半年净利润骤降38%
  10. 微信小程序 订阅消息授权