听过却没玩过Lambda表达式?了解一下
前言
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表达式?了解一下相关推荐
- python使用函数的优点-Lambda表达式在Python中的优点和缺点
学过python的人,相信都接触过Lambda表达式.本文就来谈谈Lambda表达式在Python中的优点和缺点.一方面,Lambda函数的减少了代码的行数,方便又简洁.另一方面,Lambda表达式有 ...
- 为什么Java需要lambda 表达式?
Java 为什么会引入lambda ? 在Java8出现之前,如果你想传递一段代码到另一个方法里是很不方便的.你几乎不可能将代码块到处传递,因为Java是一个面向对象的语言,因此你要构建一个属于某个类 ...
- Lambda表达式超详细总结
文章目录 1. 什么是Lambda表达式 2. 为什么使用Lambda表达式 3. Lambda表达式语法 4. 函数式接口 4.1 什么是函数式接口 4.2 自定义函数式接口 4.3 Java内置函 ...
- java 8 lambda 表达式的优缺点总结
最近接触到 lambda 表达式后,发现它基本上可以消灭所有 for 循环,换句话说,所有的 for 循环都能被 lambda 表达式改写. 但我发现,它并不是特别完美的,经过我查阅国内外不少网站的资 ...
- Lambda表达式语法及应用
前言: JDK8后,源码中开始应用Lambda表达式,所以如果想读懂源码的同学学习它是绕不过去的,至于lambda表达式在不在开发中使用,就要看自己的需求啦,他的优点很明显,简洁,非常容易并行计算,提 ...
- 【Android-Kotlin】匿名内部类与Lambda 表达式(附RecycleView监听)
一:匿名内部类 一个Test类,里面 1)1个属性 2)1个方法 a.该方法传递的参数是一个接口对象,目的是在这个方法中可以通过这个对象来调用接口方法 接口对象的接口TestInterFace内部有一 ...
- lambda表达式可以用来声明_Lambda 的骚操作,你都get到了没
点击上方关注,选择设为星标每天分享优质干货 Lambda简介 Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中 ...
- Lambda表达式从入门到玩嗨儿~
Lambda表达式 Java8新引入的语法糖 Lambda表达式*(关于lambda表达式是否属于语法糖存在很多争议,有人说他并不是语法糖,这里我们不纠结于字面表述)*.Lambda表达式是一种用于取 ...
- 10个Java 8 Lambda表达式经典示例
Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表 达式,它将允许我们将行为传到函数里.在J ...
最新文章
- jsp中session 失效设置
- MYSQL的随机抽取实现方法
- 5个拓展潜客的创意方法
- why we have to redefine _isRefreshNeeded for oData model
- 高低温湿热试验箱使用的注意事项
- 网络操作系统课后练习第三章
- 惊呆!这辆悍马自己在跑跑跑跑跑跑跑!
- homework-06
- 分段三次hermite插值python
- Java switch 使用枚举类
- 数字图像处理(三)图像复原(噪声生成,噪声滤波器,逆滤波,维纳滤波,有约束最小二乘恢复)
- IDEA如何新建一个source folder
- 利用特性、泛型、反射生成sql操作语句(待修改
- 对标金九银十:各大厂最新Java面试真题整理+简历模板
- 微信小程序python解析获取用户手机号_微信小程序如何获取用户绑定手机号
- 【报告分享】中国消费者洞察报告-领航前所未有(附下载)
- C#常用加密解密方法(MD5加密解密)
- bootloader 启动过程
- Java爬虫Ins博主所有帖子的点赞和评论导出excel
- Python爬虫之urllib.request的使用
热门文章
- Java Spring Boot 2.0实战Docker容器与架构原理,视频与课件,基于Linux环境...
- 通过深度学习从胸部X射线检测肺炎
- Vue学习笔记(2) 在html文件中创建Vue实例,并使用http-vue-loader注册单文件组件
- 《中国人民解放军文职人员条例》2023版解读
- 唯品会JAVA怎么样_Java性能优化指南及唯品会的实战
- AE制作Json动画教程
- java计算机毕业设计宿迁学院学生设计作品交流网站源代码+数据库+系统+lw文档
- 如何用python写一个文件管理程序
- 亿腾医药再冲刺赴港上市:有六种核心产品,上半年净利润骤降38%
- 微信小程序 订阅消息授权