Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中,使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。
Stream(流)是一个来自数据源的元素队列并支持聚合操作。
他不是一种数据结构,只是某种数据源的一个视图,数据源可以是一个数组,Java容器或者I/O channel等。对stream的任何修改都不会修改背后的数据源,比如对stream执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新stream。
和以前的Collection操作不同, Stream操作还有两个基础的特征:
通过 stream()
方法为集合创建流。
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
获取List列表的所有id。
List<Long> ids = demos.stream().map(Demo::getId).collect(toList());
list变成map
Map<Long, Demo> map = demos.stream().collect(toMap(Demo::getId, o -> o));
Demo target = demos.stream() .filter(d -> targetName.equals.equals(d.getName())) .findFirst() .orElse(null);
注意find()
返回的结果是Optional。
match()是filter()的缩写版本,返回结果只有boolean类型,返回是否匹配。
boolean flag = demos.stream() .map(Demo::getName) .anyMatch(condition::contains);
去重
List<Long> ids = demos.map(Demo::getId).distinct().collect(Collectors.toList());
Stream还有一些有用的API比如 groupby
、sorted
等。可在有需要时查询使用。
flatMap方法的作用就和他的名字flat一样,对于调用flatMap的流的每一个元素,执行flatMap入参中的函数式方法,由于该函数式方法必须返回一个stream