lambda表达式的应用例子和JavaSE 8特性
在JavaSE 8 引入了lambda表达式,lambda表达式的引入带来的好处是:通过语法上的改进,减少开发人员需要编写和维护的代码数量。这个在下面使用和不使用lambda的对比中可以清晰看出来。
1.
public class RunnableTest {
public static void main(String[] args){
System. out.println("===============RunnableTest=================" );
//Anonymous Runnable
Runnable r1 = new Runnable(){
@Override
public void run(){
System. out.println("Hello world, I am runnable one." );
}
};
//Lambda Runnable
Runnable r2 = ()->System. out.println("Hello world, I am runnable two");
r1.run();
r2.run();
}
}
public class ComparatorTest {
public static void main(String[] args) {
List<Person> personList = Person.createShortList();
// Sort with Inner Class
Collections.sort(personList , new Comparator<Person>(){
public int compare(Person p1 , Person p2){
return p1 .getSurName().compareTo(p2.getSurName());
}
});
System.out.println( "=== Sorted Asc SurName ===");
for(Person p: personList){
p.printName();
}
// Use Lambda instead
// Print Asc
System.out.println( "=== Sorted Asc SurName ===");
Collections.sort(personList , (Person p1, Person p2) -> p1.getSurName().compareTo(p2 .getSurName()));
for(Person p: personList){
p.printName();
}
// Print Desc
System.out.println( "=== Sorted Desc SurName ===");
Collections.sort(personList , (p1 , p2 ) -> p2.getSurName().compareTo(p1 .getSurName()));
for(Person p: personList){
p.printName();
}
}
}
(int x, int y) |
-> |
x + y |
| Argument List | Arrow Token | Body |
/**
* @author MikeW
*/
public interface MyTest<T> {
public boolean test(T t );
} /**
*
* @author MikeW
*/
public class RoboContactAnon { public void phoneContacts(List<Person> pl , MyTest<Person> aTest){
for(Person p: pl){
if (aTest.test(p)){
roboCall( p);
}
}
} public void emailContacts(List<Person> pl , MyTest<Person> aTest){
for(Person p: pl){
if (aTest.test(p)){
roboEmail( p);
}
}
} public void mailContacts(List<Person> pl , MyTest<Person> aTest){
for(Person p: pl){
if (aTest.test(p)){
roboMail( p);
}
}
} public void roboCall(Person p ){
System.out.println( "Calling " + p .getGivenName() + " " + p.getSurName() + " age " + p.getAge() + " at " + p .getPhone());
} public void roboEmail(Person p ){
System.out.println( "EMailing " + p .getGivenName() + " " + p.getSurName() + " age " + p.getAge() + " at " + p .getEmail());
} public void roboMail(Person p ){
System.out.println( "Mailing " + p .getGivenName() + " " + p.getSurName() + " age " + p.getAge() + " at " + p .getAddress());
} } /**
* @author MikeW
*/
public class RoboCallTest03 { public static void main(String[] args) { List<Person> pl = Person. createShortList();
RoboContactAnon robo = new RoboContactAnon(); System.out.println( "\n==== Test 03 ====");
System.out.println( "\n=== Calling all Drivers ===" );
robo.phoneContacts( pl,
new MyTest<Person>(){
@Override
public boolean test(Person p){
return p .getAge() >=16;
}
}
); System.out.println( "\n=== Emailing all Draftees,Using Lambda Expression ===" );
MyTest<Person> allDraftees = (p )->p .getAge() >= 18 && p.getAge() <= 25 && p.getGender() == Gender.MALE;
robo.emailContacts( pl, allDraftees); System.out.println( "\n=== Mail all Pilots,Using Lambda Expression ===" );
robo.mailContacts( pl,( p)-> p.getAge() >= 23 && p.getAge() <= 65); }
}
/**
*
* @author MikeW
*/
public class RoboContactLambda {
public void phoneContacts(List<Person> pl , Predicate<Person> pred){
for(Person p: pl){
if (pred.test(p)){
roboCall( p);
}
}
} public void emailContacts(List<Person> pl , Predicate<Person> pred){
for(Person p: pl){
if (pred.test(p)){
roboEmail( p);
}
}
} public void mailContacts(List<Person> pl , Predicate<Person> pred){
for(Person p: pl){
if (pred.test(p)){
roboMail( p);
}
}
} public void roboCall(Person p ){
System.out.println( "Calling " + p .getGivenName() + " " + p.getSurName() + " age " + p.getAge() + " at " + p .getPhone());
} public void roboEmail(Person p ){
System.out.println( "EMailing " + p .getGivenName() + " " + p.getSurName() + " age " + p.getAge() + " at " + p .getEmail());
} public void roboMail(Person p ){
System.out.println( "Mailing " + p .getGivenName() + " " + p.getSurName() + " age " + p.getAge() + " at " + p .getAddress());
} } /**
*
* @author MikeW
*/
public class RoboCallTest04 { public static void main(String[] args){ List<Person> pl = Person. createShortList();
RoboContactLambda robo = new RoboContactLambda(); // Predicates
Predicate <Person> allDrivers = p -> p .getAge() >= 16;
Predicate <Person> allDraftees = p -> p .getAge() >= 18 && p.getAge() <= 25 && p.getGender() == Gender.MALE;
Predicate<Person> allPilots = new Predicate<Person>(){ @Override
public boolean test(Person p )
{ return p .getAge() >= 23 && p.getAge() <= 65;
}
}; System.out.println( "\n==== Test 04 ====");
System.out.println( "\n=== Calling all Drivers ===" );
robo.phoneContacts( pl, allDrivers); System.out.println( "\n=== Emailing all Draftees ===" );
robo.emailContacts( pl, allDraftees); System.out.println( "\n=== Mail all Pilots ===");
robo.mailContacts( pl, allPilots); // Mix and match becomes easy
System.out.println( "\n=== Mail all Draftees ===");
robo.mailContacts( pl, allDraftees); System.out.println( "\n=== Call all Pilots ===");
robo.phoneContacts( pl, allPilots); }
}
/**
* @author MikeW
*/
public class NameTestNew { public static void main(String[] args) { System.out.println( "\n==== NameTestNew ==="); List<Person> list1 = Person. createShortList(); // Print Custom First Name and e-mail
System.out.println( "===Custom List===");
for (Person person: list1){
System. out.println(
person. printCustom(p -> "Name: " + p.getGivenName() + " EMail: " + p.getEmail())
);
} // Define Western and Eastern Lambdas
Function<Person, String> westernStyle = p -> {
return "\nName: " + p .getGivenName() + " " + p.getSurName() + "\n" +
"Age: " + p .getAge() + " " + "Gender: " + p .getGender() + "\n" +
"EMail: " + p .getEmail() + "\n" +
"Phone: " + p .getPhone() + "\n" +
"Address: " + p .getAddress();
}; Function<Person,String> easternStyle = new Function<Person,String>(){ @Override
public String apply(Person p )
{
return "\nName: " + p .getSurName() + " "
+ p.getGivenName() + "\n" + "Age: " + p .getAge() + " " +
"Gender: " + p .getGender() + "\n" +
"EMail: " + p .getEmail() + "\n" +
"Phone: " + p .getPhone() + "\n" +
"Address: " + p .getAddress();
} }; // Print Western List
System.out.println( "\n===Western List===");
for (Person person: list1){
System. out.println(
person. printCustom(westernStyle)
);
} // Print Eastern List
System.out.println( "\n===Eastern List===");
for (Person person: list1){
System. out.println(
person. printCustom(easternStyle)
);
} }
}
/**
*
* @author MikeW
*/
public class SearchCriteria { private final Map<String, Predicate<Person>> searchMap = new HashMap<>(); private SearchCriteria() {
super();
initSearchMap();
} private void initSearchMap() {
Predicate<Person> allDrivers = p -> p .getAge() >= 16;
Predicate<Person> allDraftees = p -> p .getAge() >= 18 && p.getAge() <= 25 && p.getGender() == Gender.MALE;
Predicate<Person> allPilots = p -> p .getAge() >= 23 && p.getAge() <= 65; searchMap.put( "allDrivers", allDrivers );
searchMap.put( "allDraftees", allDraftees );
searchMap.put( "allPilots", allPilots ); } public Predicate<Person> getCriteria(String PredicateName) {
Predicate<Person> target; target = searchMap.get( PredicateName); if (target == null) { System. out.println("Search Criteria not found... " );
System.exit(1); } return target; } public static SearchCriteria getInstance() {
return new SearchCriteria();
}
}
/**
*
* @author MikeW
*/
public class Test02Filter { public static void main(String[] args) { List<Person> pl = Person. createShortList(); SearchCriteria search = SearchCriteria. getInstance(); System.out.println( "\n=== Western Pilot Phone List ===" ); pl.stream().filter(search .getCriteria("allPilots")).forEach(Person::printWesternName); System.out.println( "\n=== Eastern Draftee Phone List ===" ); pl.stream().filter(search .getCriteria("allDraftees")).forEach(Person::printEasternName);
//filter(Predicate<? super Person>)
//forEach(Consumer<? super Person>)
}
}
在Java SE 8 中,集合对象有流,使用流中的方法filter,可以筛选出符合筛选条件的元素。
参考资料:
http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/Lambda-QuickStart/index.html
https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html
lambda表达式的应用例子和JavaSE 8特性的更多相关文章
- Java lambda 表达式详解(JDK 8 新特性)
什么是 lambda 表达式 lambda 表达式(拉姆达表达式)是 JAVA 8 中提供的一种新的特性,它使 Java 也能进行简单的"函数式编程". lambda 表达式的本质 ...
- Lambda 表达式的演示样例-来源(MSDN)
本文演示怎样在你的程序中使用 lambda 表达式. 有关 lambda 表达式的概述.请參阅 C++ 中的 Lambda 表达式. 有关 lambda 表达式结构的具体信息,请參阅 Lambda 表 ...
- C++11里面的Lambda表达式
Lambda Expressions in C++ C++中的Lambda表达式 In Visual C++, a lambda expression—referred to as a lambda— ...
- Java8(1)之Lambda表达式初步与函数式接口
Lambda表达式初步 介绍 什么是Lambda表达式? 在如 Lisp.Python.Ruby 编程语言中,Lambda 是一个用于表示匿名函数或闭包的运算符 为何需要lambda表达式? 在 Ja ...
- lambda表达式底层处理机制
为了支持函数式编程,Java 8引入了Lambda表达式,那么在Java 8中到底是如何实现Lambda表达式的呢? Lambda表达式经过编译之后,到底会生成什么东西呢? 在没有深入分析前,让我们先 ...
- lambda表达式/对象引用计数
★lambda表达式的用法例:I=[(lambda x: x*2),(lambda y: y*3)]调用:for x in I: print x(2)输出:4,6 ★获取对象的引用次数sys.getr ...
- Lambda 表达式的示例
本文中的过程演示如何使用 lambda 表达式. 有关 lambda 表达式的概述,请参见 C++ 中的 Lambda 表达式. 有关 lambda 表达式结构的更多信息,请参见 Lambda 表达式 ...
- JAVA8初探-让方法参数具备行为能力并引入Lambda表达式
关于JAVA8学习的意义先来贴一下某网站上的对它的简单介绍:“Java 8可谓Java语言历史上变化最大的一个版本,其承诺要调整Java编程向着函数式风格迈进,这有助于编写出更为简洁.表达力更强,并且 ...
- lambda函数、lambda表达式
C++11 新特性:Lambda 表达式 豆子 2012年5月15日 C++ 10条评论 参考文章:https://blogs.oracle.com/pcarlini/entry/c_1x_tidbi ...
随机推荐
- javaIO--字节流
流---是指的一组有序的.有气垫和重点的字节集合,是对的护具传输的总称或者抽象. 流采用缓冲区技术,当写一个数据时,系统将数据发送到缓冲区而不是外部设备(如硬盘),当读一个数据时,系统实际是从缓冲区读 ...
- Java中I/O流之数据流
Java 中的数据流: 对于某问题:将一个 long 类型的数据写到文件中,有办法吗? 转字符串 → 通过 getbytes() 写进去,费劲,而且在此过程中 long 类型的数需要不断地转换. ...
- Alpha 冲刺4
队名:日不落战队 安琪(队长) 今天完成的任务 组织第四次站立式会议. 完成40%草稿箱前端界面. 明天的计划 剩下的60%草稿箱前端界面. 如果还有时间,尝试去调用数据. 还剩下的任务 回收站前端界 ...
- QT分析之QApplication的初始化
原文地址:http://blog.163.com/net_worm/blog/static/1277024192010097430321/ 在开始分析之前交代一下,一是分析的QT在Window平台实现 ...
- 基于实现Controller接口的简单Spring工程
这个Spring工程的特点是:实现了Controller接口(这样就可以在url中传参数?,待调查) 一下为代码,可运行. 1,web.xml <servlet> <servlet- ...
- 【bzoj3132】上帝造题的七分钟 二维树状数组区间修改区间查询
题目描述 “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作. ...
- 【codevs1380】没有上司的舞会 树形dp
题目描述 Ural大学有N个职员,编号为1~N.他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.每个职员有一个快乐指数.现在有个周年庆宴会,要求与会职员的快乐指数 ...
- [Leetcode] valid sudoku 有效数独
Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be ...
- syslog服务器配置笔记
syslog服务器可以用作一个网络中的日志监控中心,rsyslog是一个开源工具,被广泛用于Linux系统以通过TCP/UDP协议转发或接收日志消息.本文我们来讲讲在 Linux 上配置一个 sysl ...
- 20165218 2017-2018-1 《Java程序设计》第三周学习总结
20165218 2017-2018-1 <Java程序设计>第三周学习总结 教材学习内容总结-第四章 类与对象 面向对象语言 需要完成某种任务时,首先要想到,谁去完成任务,即哪个对象去完 ...