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 ...
随机推荐
- Java Try-with-resources
目录 资源管理与 Try-Catch-Finally,旧风格 Try-with-resources 管理多个资源 自定义 AutoClosable 实现 Try-with-resources 是 ja ...
- John:How JavaScript Timers Work
John大神的bolg链接:http://ejohn.org/blog/how-javascript-timers-work/ JavaScript中的定时器经常表现的跟我们想象的不同,我们用三个函数 ...
- CSS 笔记(一)
学习了张鑫旭大神的浮动教程,记一下笔记. 浮动最开始是为了文字环绕图片效果. 浮动会破坏父元素的包裹. 清除浮动:在父元素加上clearfix(after不兼容ie6 7,zoom为ie6 7下方法) ...
- oracle之回滚数据表 笔记
alter table [tableName] enable row movement;flashback table [tableName] to timestamp to_timestamp('2 ...
- MYSQL——root密码更换
方法1: 用SET PASSWORD命令mysql -u rootmysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass') ...
- hdu 3022 Sum of Digits
http://acm.hdu.edu.cn/showproblem.php?pid=3022 题意: 最多不超过10000组数据,每组数据给定两个数n,m,求一个最小的数,使得该数每一位之和等于n,每 ...
- CF876 F 思维 枚举
给你n个数,问有几个区间满足,区间内或操作大于区间内的任意数. 首先可以知道,两数或操作的结果必定不会小于两者间的最大值,也就是说对于一个区间中,不合法的状态只有两值或相等.那么我们可以考虑枚举每个数 ...
- [转载]HTML5浏览器测试网站汇总
http://www.cnblogs.com/javawebsoa/archive/2012/04/19/2458224.html 浏览器支持情况统计 When Can IUse:图表经常更新,展示了 ...
- mac 无法验证副本
转: 这个是拆机后断了电源,导致时间不对,也就是说现在电脑的时间比U盘制作的时间还早,所以有这样的错误提示. 在终端里面修改时间请参考下面的代码,按回车键确认:date 062614102014.30 ...
- 原生JS获取元素的位置与尺寸
1.内高度.内宽度: 内边距 + 内容框 element.clientWidth element.clientHeight 2.外高度,外宽度: 边框 + 内边距 + 内容框 element.offs ...