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 ...
随机推荐
- 各种蕴含算法思想的DP - 1
study from: https://www.cnblogs.com/flashhu/p/9480669.html 1.前缀和 https://www.luogu.org/problemnew/sh ...
- NB-IoT 的“前世今生”
作者:个推B2D研发工程师 海晏 根据<爱立信2018移动报告>(Ericsson Mobility Report,June 2018)的预测,蜂窝物联网设备连接数将在2023年达到35亿 ...
- Nginx利用lua剪辑FastDFS图片
Nginx利用lua剪辑FastDFS中的图片 我们经常用FastDFS来做图片服务器,通过nginx来上传或者获取图片.本文要实现的功能是,当客户端要获取不同尺寸的图片是,lua根据url中的尺寸大 ...
- Hadoop基础-MapReduce的常用文件格式介绍
Hadoop基础-MapReduce的常用文件格式介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MR文件格式-SequenceFile 1>.生成SequenceF ...
- Ubantu里面的Sublime Text3不支持中文的解决办法
参考的大佬链接:https://github.com/lyfeyaj/sublime-text-imfix 更新然后将系统升级到最新版本,在linux终端输入 sudo apt-get update ...
- Codeforces Round #477 (rated, Div. 2, based on VK Cup 2018 Round 3) F 构造
http://codeforces.com/contest/967/problem/F 题目大意: 有n个点,n*(n-1)/2条边的无向图,其中有m条路目前开启(即能走),剩下的都是关闭状态 定义: ...
- [iOS]深拷贝/浅拷贝区别
来点鸡汤: // 所谓拷贝 就是在原有的对象的基础上产生一个新的副本对象.有两点原则: // 1. 改变原对象的属性和行为不会影响副本对象 // 2. 改变副本对象的属性和行为不会影响原对象 ...
- [iOS]Xcode+GitHub远程代码托管(GIT, SVN)
先来看看什么是代码远程托管: 其实就是将我们的代码上传到GitHub的服务器上, 供别人下载, 当然了也可以在团队开发的时候, 使用GitHub进行代码合并工作, 下面我们进入正题 (已经有远程仓库的 ...
- [整理]C 内核源代码-学习资料
GNU C gnu项目:http://www.gnu.org/software/software.html ftp:http://ftp.gnu.org/gnu/ 托管:http://savannah ...
- 记关于vue-cli3 本地代理模拟数据的实践
网上说的基本都是使用express或http-server作为服务器或其它什么东西自己把玩php也有些年头,就用php好了 服务环境 apache,php先配置好隐藏php后缀扩展名: 在httpd. ...