Java8 Lambda 之 Collection Stream
Lambda 之 Collection Stream
Collection.stream()
测试实体类
class Demo {
private Long id;
private String name;
// Getters and Setters
}
// 实例化并组成一个List
List<Demo> demos = Lists.newArrayList(new Demo(1L, "SF"), new Demo(2L, "AXE"));
1.map + collect用法
场景1:获取List列表的所有id
No Lambda
public static List<Long> getIds(List<Demo> demos){
List<Long> ids = Lists.newArrayList();
for (Demo d : demos) {
ids.add(d.getId());
}
return ids;
}
Lambda’s show
List<Long> ids = demos.stream().map(Demo::getId).collect(toList());
最后toList()
可以有更多的实现,比如
Set<Long> ids = demos.stream().map(Demo::getId).collect(toSet());
场景2:list变成map
有时候我们把list变成map,将多次List的O(n)
遍历变成Map的O(1)
查询,拿空间换时间
No lambda
public static Map<Long, Demo> getIds(List<Demo> demos){
Map<Long, Demo> map = Maps.newHashMap;
for (Demo d : demos) {
map.put(d.getId, d);
}
return map;
}
Lambda‘s show
Map<Long, Demo> map = demos.stream().collect(toMap(Demo::getId, o -> o));
2.filter
场景1:从List中找到name="SF"
的Demo实例
No lambda
public static Demo getSpecifyDemo(String name, List<Demo> demos){
Demo target = null;
for (Demo demo : demos) {
if (name.equals(demo.getName())) {
target = demo;
}
}
return target;
}
Lambda's show--粗犷的老汉推车
String targetName = "SF";
Demo target = demos.stream().filter(d -> targetName.equals(d.getName())).findFirst().orElse(null);
这种写法非常简单,但是调用链太长,一个lambda能够绕地球好几圈,最好写成以下格式,防止步子迈得太大。
Lambda's show--优雅传教士
Demo target = demos.stream()
.filter(d -> targetName.equals.equals(d.getName()))
.findFirst()
.orElse(null);
find()
的结果是Optional
,Optional
号称NPE
终结者,于是对于find()
的结果你可以随意使用终结者携带的任何武器,例如orElse()
,ifPresent()
,isPresent()
...每个用起来都是那种哒哒哒冒蓝火的,更多姿势详见Optional
的裸体源码。
3.match
match()
是filter()
的缩写版本,返回结果只有boolean
类型,返回是否匹配。
场景1:当前list中某个元素是否符合某个条件
这个例子,给出另一个用法Demo::getId
No lambda
List<String> condition = new ArrayList<>();
condition.add("SF");
public static boolean isExist(List<String> condition, List<Demo> demos){
boolean flag = false;
for (Demo demo : demos) {
if (condition.contains(demo.getName())) {
flag = true;
break;
}
}
return flag;
}
Lambda's show 使用filter
boolean flag = demos.stream()
.map(Demo::getName)
.filter(condition::contains)
.findAny()
.isPresent();
Lambda's show 直接使用match
boolean flag = demos.stream()
.map(Demo::getName)
.anyMatch(condition::contains);
Java8 Lambda 之 Collection Stream的更多相关文章
- 十分钟学会Java8:lambda表达式和Stream API
Java8 的新特性:Lambda表达式.强大的 Stream API.全新时间日期 API.ConcurrentHashMap.MetaSpace.总得来说,Java8 的新特性使 Java 的运行 ...
- Java8 新特性学习 Lambda表达式 和 Stream 用法案例
Java8 新特性学习 Lambda表达式 和 Stream 用法案例 学习参考文章: https://www.cnblogs.com/coprince/p/8692972.html 1.使用lamb ...
- JDK1.8中的Lambda表达式和Stream
1.lambda表达式 Java8最值得学习的特性就是Lambda表达式和Stream API,如果有python或者javascript的语言基础,对理解Lambda表达式有很大帮助,因为Java正 ...
- 夯实Java基础(二十三)——Java8新特征之Stream API
1.Stream简介 Java8中除了引入了好用的Lambda表达式.Date API之外,另外还有一大亮点就是Stream API了,也是最值得所有Java开发人员学习的一个知识点,因为它的功能非常 ...
- java8 Lambda表达式的新手上车指南(1)
背景 java9的一再推迟发布,似乎让我们恍然想起离发布java8已经过去了三年之久,java8应该算的上java语言在历代版本中变化最大的一个版本了,最大的新特性应该算得上是增加了lambda表达式 ...
- 【Java学习笔记之三十一】详解Java8 lambda表达式
Java 8 发布日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Java 8之前 ...
- java8 Lambda表达式的新手上车指南(1)--基础语法和函数式接口
背景 java9的一再推迟发布,似乎让我们恍然想起离发布java8已经过去了三年之久,java8应该算的上java语言在历代版本中变化最大的一个版本了,最大的新特性应该算得上是增加了lambda表达式 ...
- java8 快速入门 lambda表达式 Java8 lambda表达式10个示例
本文由 ImportNew - lemeilleur 翻译自 javarevisited.欢迎加入翻译小组.转载请见文末要求. Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发 ...
- Java8 lambda表达式10个示例
Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Ja ...
随机推荐
- mysql新版本问题
异常错误:Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.c ...
- 论攻击Web应用的常见技术
攻击目标: 应用HTTP协议的服务器和客户端.以及运行在服务器上的Web应用等. 攻击基础: HTTP是一种通用的单纯协议机制.在Web应用中,从浏览器那接受到的HTTP请求的全部内容,都可以在客户端 ...
- bzoj千题计划283:bzoj4516: [Sdoi2016]生成魔咒(后缀数组)
http://www.lydsy.com/JudgeOnline/problem.php?id=4516 考虑在后面新加一个字母产生的影响 假设是第i个 如果不考虑重复,那么会增加i个不同的字符串 考 ...
- Codeforces 931 C. Laboratory Work
http://codeforces.com/problemset/problem/931/C 题意: 给定一个数列,要求构造一个等长的数列,使得数列的平均值等于给定数列,并且使得构造出的数列中与原数列 ...
- bzoj千题计划256:bzoj2194: 快速傅立叶之二
http://www.lydsy.com/JudgeOnline/problem.php?id=2194 相乘两项的下标 的 差相同 那么把某一个反过来就是卷积形式 fft优化 #include< ...
- 怎样提高WebService的性能
服务器端WebService程序: using System.Runtime.Serialization.Formatters.Binary; using System.IO; using Syste ...
- 洛谷 P1525 【关押罪犯】种类并查集
题解 P1525 [关押罪犯]:种类并查集 前言: 在数据结构并查集中,种类并查集属于扩展域并查集一类. 比较典型的题目就是:食物链(比本题难一些,有三个种类存在) 首先讲一下本题的贪心,这个是必须要 ...
- 跳过复制错误——sql_slave_skip_counter
昨天不少同学讨论<小心,前方有雷 —— sql_slave_skip_counter>,有说作者在玩文字游戏,扯了那么多sql_slave_skip_counter=1不还是跳过一个事务嘛 ...
- java线程池的初探
问题来源 发现学习很多技术都提到了线程池的技术,自己的线程池方面没有仔细研究过,现在看了点东西来这里总结下,最近发现写博客是一个很好的锻炼自己并且将学到的东西更加理解的一个方式. 问题探究 java的 ...
- 【mongoDB】 分享系列
mongoDB 作为一个非关系性数据库(功能很像关系型数据库) MongoDB 之一 MongoDB是什么 MongoDB 之二 增-删-改-查 MongoDB 之三 数据类型 MongoDB 之四 ...