Java 8 新特性之 Lambda表达式
Lambda的出现就是为了增强Java面向过程编程的深度和灵活性。今天就来分享一下在Java中经常使用到的几个示例,通过对比分析,效果应该会更好。
–
1、实现Runnable线程案例
其存在的意义就是用Lambda来代替匿名类,如下:
// before java 8
new Thread(new Runnable(){
@Override
public void run(){
System.out.println("Before Java 8");
}
}
// Java 8 way
new Thread(()-> System.out.println("Java 8 Way"););
我们可以使用下面的语法来完成Lambda的书写:
- (params) -> expression
- (params) -> statement
- (params) -> {statements}
如果表达式不需要参数,那么可以简写如下:
() -> Ssytem.out.println("Something Here!");
2、实现事件处理
这里拿Swing编程来举例,主要的作用是简化事件监听器的代码书写。
// Before java 8
JButton button = new JButton("Show");
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
System.ut.println("Before Java 8");
}
});
// Java 8 Way
button.addActionListener((e)-> {
System.out.println("Java 8 Way");
};
不难看出,使用Lambda来代替匿名类是一件很优雅的事情。
3、使用Lambda表达式遍历List集合
遍历输出一个集合是一件很简单但是很繁琐的事情,但是有了Lambda之后,一切。又将变的优雅起来。
// Before Java 8
List ls = Arrays.asList("Lambdas","Default Method","Stream API","Date and Time Api");
for(String item : ls){
System.out.println(item);
}
// Java 8 Way
List ls = Arrays.asList("Lambdas","Default Method","Stream API","Date and Time Api");
// 这里很重要,因为输出语句后面没有那个分号!!!
ls.forEach(item -> System.out.println(item));
4、使用Lambda表达式和函数接口
为了使得Java支持函数编程,Java8 加入了一个新的包java.util.function,其中有一个接口java.util.function.Predicate 是支持Lambda函数编程。
@Test
public void test6() throws Exception {
List<String> languages = Arrays.asList("C", "C++", "Java", "HTML", "CSS", "JavaScript", "C#", "MySQL");
List<String> result = languages.stream().filter(item -> item.startsWith("J")).collect(Collectors.toList());
System.out.println(languages.toString());
System.out.println("---------------co" + "mpared result--------------");
System.out.println("With J:");
System.out.println(result.toString());
}
上面的filter(item -> item.startWith(“J”))就是对此接口的简单的使用,这便是因为Lambda支持接口调用的体现。
详细的操作方式,我们可以参考Stream API来进行更加复杂的操作。
5、较复杂的结合Predicate接口的使用
此处主要演示的是结合流操作,类似于Linux的管道命令。
Predicate<String> startsWithJ = (n) -> n.startsWith("J");
Predicate<String> fourLetterLong = (n) -> n.length() == 4;
names.stream()
.filter(startsWithJ.and(fourLetterLong))
.forEach((n) -> System.out.print("\nName, which starts with
'J' and four letter long is : " + n));
在流操作的整个过程中,StreamAPI内使用的就是我们定义好的Predicate实现。是不是感觉很方便啦。
6、使用Lambda实现Map和Reduce
- 类比Python中的可变数组,Java8 的Map就是实现了类似的功能。我们可以方便的借助Lambda来实现元素信息的改变。
// Before Java 8
List costBeforeTax = Arrays.asList(100,200,300,400,500);
for(Integer cost: costBeforeTax){
double price = cost+.12*cost;
System.out.println(price);
}
// Java 8 Way
List costBeforeTax = Arrays.asList(100,200,300,40,500);
costBeforeTax.stream().map((cost)-> cost+.12*cost).forEach(System.out.println(cost));
- reduce() 是将集合中所有的值结合,汇聚到一个值中,Reduce类似SQL语句中的sum(),avg(),count()等等。
// Applying 12% VAT on each purchase
// Old way:
List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
double total = 0;
for (Integer cost : costBeforeTax) {
double price = cost + .12*cost;
total = total + price;
}
System.out.println("Total : " + total);
// New way:
List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
double bill = costBeforeTax.stream().map((cost) -> cost + .12*cost)
.reduce((sum, cost) -> sum + cost)
.get();
System.out.println("Total : " + bill);
Output
Total : 1680.0
Total : 1680.0
7.通过filtering 创建一个字符串String的集合
Filtering是对大型Collection操作的一个通用操作,Stream提供filter()方法,接受一个Predicate对象,意味着你能传送lambda表达式作为一个过滤逻辑进入这个方法:
// Create a List with String more than 2 characters
List<String> filtered = strList.stream().filter(x -> x.length()> 2)
.collect(Collectors.toList());
System.out.printf("Original List : %s, filtered list : %s %n",
strList, filtered);
Output :
Original List : [abc, , bcd, , defg, jk], filtered list : [abc, bcd, defg]
8、对集合中的每个元素应用函数
// Convert String to Uppercase and join them using coma
List<String> G7 = Arrays.asList("USA", "Japan", "France", "Germany",
"Italy", "U.K.","Canada");
String G7Countries = G7.stream().map(x -> x.toUpperCase())
.collect(Collectors.joining(", "));
System.out.println(G7Countries);
Output :
USA, JAPAN, FRANCE, GERMANY, ITALY, U.K., CANADA
上面是将字符串转换为大写,然后使用逗号串起来。
9、通过复制不同的值创建一个子列表
使用Stream的distinct()方法过滤集合中的重复性的元素。
// Create List of square of all distinct numbers
List<Integer> numbers = Arrays.asList(9, 10, 3, 4, 7, 3, 4);
List<Integer> distinct = numbers.stream().map( i -> i*i).distinct()
.collect(Collectors.toList());
System.out.printf("Original List : %s, Square Without duplicates :
%s %n", numbers, distinct);
Output :
Original List : [9, 10, 3, 4, 7, 3, 4], Square Without
duplicates : [81, 100, 9, 16, 49]
10、计算List中的元素的最大值,最小值,总和以及平均值
@Test
public void test7() throws Exception {
List<Integer> ls = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
IntSummaryStatistics stats = ls.stream().mapToInt((x)->x).summaryStatistics();
System.out.println("Max:"+ stats.getMax());
System.out.println("Min:"+ stats.getMin());
System.out.println("Avg:"+ stats.getAverage());
System.out.println("SUm:"+ stats.getSum());
}
结语
最后,推荐一个比较好的StreamAPI的介绍网址,里面有很多详细的示例,相信对大家的变成会有很大的帮助。
Java 8 新特性之 Lambda表达式的更多相关文章
- Java 8新特性-3 Lambda 表达式
在 Java 8 之前,匿名内部类,监听器和事件处理器的使用都显得很冗长,代码可读性很差. 在Java 8 之前使用匿名内部类: 例如 interface ITestPrint{ public voi ...
- java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合
java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合 比如,我有一张表: entity Category.java service CategoryServic ...
- Java8 新特性学习 Lambda表达式 和 Stream 用法案例
Java8 新特性学习 Lambda表达式 和 Stream 用法案例 学习参考文章: https://www.cnblogs.com/coprince/p/8692972.html 1.使用lamb ...
- JDK1.8新特性(一) ----Lambda表达式、Stream API、函数式接口、方法引用
jdk1.8新特性知识点: Lambda表达式 Stream API 函数式接口 方法引用和构造器调用 接口中的默认方法和静态方法 新时间日期API default Lambda表达式 L ...
- Java 8 新特性:Lambda、Stream和日期处理
1. Lambda 简介 Lambda表达式(Lambda Expression)是匿名函数,Lambda表达式基于数学中的λ演算得名,对应于其中的Lambda抽象(Lambda Abstract ...
- Java 8新特性(Lambda,Stream API)
由于最近总监要求学习Java 8的一些知识,就去网上找了 一套教程来学习学习,将学习结果做一个小的总结记录,方便以后使用: 1.Java 8的优点 2.Lambda表达式优点 2.1Lambda实例 ...
- 夯实Java基础(二十二)——Java8新特性之Lambda表达式
1.前言 Java 8于14年发布到现在已经有5年时间了,经过时间的磨练,毫无疑问,Java 8是继Java 5(发布于2004年)之后的又一个非常最重要的版本.因为Java 8里面出现了非常多新的特 ...
- 【Java新特性】Lambda表达式典型案例,你想要的的都在这儿了!!
写在前面 不得不说,有些小伙伴的学习热情真高,学完了Lambda表达式的语法,想来几个典型案例再强化下.于是问冰河能否给几个Lambda表达式的典型使用示例.于是乎,便有了这篇文章. 案例一 需求 调 ...
- Java 8新特性之lambda(八恶人-2)
Major Marquis Warren 沃伦·马奎斯少校 “Tring to get a couple of bounties in to Red Rock.”我想带几个通缉犯去红石镇 一.基本介绍 ...
随机推荐
- ●杜教筛入门(BZOJ 3944 Sum)
入门杜教筛啦. http://blog.csdn.net/skywalkert/article/details/50500009(好文!) 可以在$O(N^{\frac{2}{3}})或O(N^{\f ...
- hdu 5514 Frogs(容斥)
Frogs Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- bzoj2434阿狸的自动机
转载自 http://www.cnblogs.com/zj75211/p/6934976.html ●BZOJ 2434: [Noi2011]阿狸的打字机 ●赘述题目 (题意就不赘述了) ●解法: ...
- C语言程序设计预备作业。
1. 阅读邹欣老师的博客--师生关系,针对文中的几种师生关系谈谈你的看法,你期望的师生关系是什么样的? 答:我理想中的师生关系是Coach/Trainee(健身教练/健身学员)的关系.因为邹老师就如同 ...
- App上架应用市场,如何攻破安全过检难题
App的安全过检与众所熟知的安全检测是两个完全不同的概念.首先App行业本身对App安全过检有一定的要求与规范,其次2017年6月1日正式实施的<中国网络安全法>中就曾要求App在渠道上线 ...
- 微信小程序开发 导入文件说没找到.json的问题
这个真的坑爹 网上的答案也没几个靠谱 说白了就是找个空文件直接创建 然后复制粘贴 反应了这玩意ide不成熟 进去之后直接创了个quick start的源码 也就是我们看的这个网页建议我们下载的源码 老 ...
- Lintcode392 Is Subsequence solution 题解
[题目描述] Given a string s and a string t, check if s is subsequence of t. You may assume that there is ...
- win8以上系统查看iis网站进程内存占用情况
由于win8以上系统在任务管理器中已经屏蔽了具体的IIS网站的进程,在进程以及详细中无法区分是哪个站点了,所以我们需要先知道各站点对应的进程pid,然后再到任务管理器中根据具体的pid查看资源占用情况 ...
- spring的事务配置方法
spring事务的配置有两种方式 1.xml配置的声明式事务配置 (1)配置数据源信息dataSource(使用阿里的数据源) <bean id="dataSource" c ...
- 剑指架构师系列-Redis集群部署
初步搭建Redis集群 克隆已经安装Redis的虚拟机,我们使用这两个虚拟机中的Redis来搭建集群. master:192.168.2.129 端口:7001 slave:192.168.2.132 ...