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 ...
随机推荐
- isspace 对含有中文 的字符串进行检查的时候表现不正常!?
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> ...
- websoclet简单示例 my 改
首先,创建一个 maven war 项目: 首先,pom文件: <project xmlns="http://maven.apache.org/POM/4.0.0" xmln ...
- PowerDesigner 打印错误
PowerDesigner打开pdm文件时报“打印错误”(解决) 原创作品,出自 “深蓝的blog” 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任. 深蓝的blog:http://b ...
- Java基础-虚拟内存之映射字节缓冲区(MappedByteBuffer)
Java基础-虚拟内存之映射字节缓冲区(MappedByteBuffer) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.映射字节缓冲区 1>.什么是虚拟内存 答:虚拟内 ...
- FFprobe使用指南
http://blog.csdn.net/stone_wzf/article/details/45378759 http://blog.chinaunix.net/uid-26000296-id-42 ...
- android tools相关
1.showin 在include 的根节点设置,可一预览效果
- spark RDD 常见操作
fold 操作 区别 与 co 1.mapValus 2.flatMapValues 3.comineByKey 4.foldByKey 5.reduceByKey 6.groupByKey 7.so ...
- 20155315 2016-2017-2 《Java程序设计》第七周学习总结
教材学习内容总结 第12章 Lambda语法 Lambda定义 一个不用被绑定到一个标识符上,并且可能被调用的函数. 在只有Lambda表达式的情况下,参数的类型必须写出来,如果有目标类型的话,在编译 ...
- 第13月第10天 swift3.0
1. Type 'Any' has no subscript members 这一条简直莫名其妙.大体意思就是,你这个类型"Any"不是个数组或者字典,不能按照下标取东西. 我之前 ...
- LEARN HOW TO HACK
出处:https://www.hackerone.com/hacker101 什么是HACKER101? https://hacker101.com/Hacker101是一个视频,资源和实践活动的集合 ...