方法名 JDK版本 备注
创建Stream of(T… ) 8
empty() 8 创建空的Stream流
generate() 8 生成无限流
iterate() 9 创建无限流
ofNullable() 9 类似于Optional ofNullable()
映射和过滤 filter() 8
map[int double long]() 8 一一映射
flatMap[int double long]() 8 1、一对多映射
抽取流和组合流 limit() 8
skip() 8 跳过前几个,和limit互补
takeWhile() 9 当满足条件留下
dropWhile() 9 满足条件丢弃
concat() 8 连接两个流,静态方法
其余流的转换 distinct() 8 去除重复数值
sorted() 8 按照自然顺序排序
peek() 8 一般对元素的内部属性进行调整,类型不发生改变
结束操作(约简操作) max() 8 最大值
min() 8 最小值
count() 8 统计数量
findFirst 8 找出第一个,返回Optional
findAny 8 找出任意一个,返回Optional
anyMatch 8 任意一个匹配,boolean
allMatch 8 全部匹配,boolean
noneMatch 8 没有匹配的,boolean
reduce reduce(accumulator) 8 执行累加,返回Optional
reduce(identify, accumulator) 8 带有幺元数,返回固定值
reduce(identify, accumulator, combiner) 8 累加器和组合器
收集操作 forEach() 8 遍历所有流元素
toArray([Integer[]::new]) 8 转为类型对象数组。默认为Object数组
collect(Collectors.toList()) 8 转为list
collect(Collectors.toSet()) 8 转为Set
collect(Collectors.toCollection()) 8 转为自定义集合
collect(Collectors.summarizingInt()) 8 转为数学统计对象
映射到表中 toMap(key, value) 8 冲突会报错
toMap(key, value, overload) 8 指明冲突后value的取值
toMap(key, value, overload / exception, TreeMap::new) 8
分组和分区 groupingBy() 8 分组
partitionBy() 8 分区
下游收集器 groupingBy(Person::getGender, Collectors.toSet()) 8 分组结果为Set去重
groupingBy(Person::getGender, Collectors.counting()) 8 分组结果进行计数
groupingBy(Person::getGender, Collectors.summingLong(Person::getId)) 8 分组结果求和
groupingBy(Person::getGender, Collectors.summarizingLong(Person::getId)) 8 分组结果转为数学统计
groupingBy(Person::getGender, Collectors.maxBy(Comparator.comparing(Person::getName) 8 分组结果求取最大值
groupingBy(Person::getGender, Collectors.minBy(Comparator.comparing(Person::getName)) 8 同上,最小值
groupingBy(Person::getGender, Collectors.collectingAndThen(Collectors.toSet(), Set::size)) 8 先收集在转换
groupingBy(Person::getGender, Collectors.mapping(Person::getName, Collectors.toSet())) 8 先转换在收集
基本类型流 range 8 获取一定范围内的数据流
rangeClosed 8 同上,闭区间
of 8 直接创建数据流
toArray() 8 转为int[]
sum / average/ min / max 8 计算结果
summaryStatistics 8 数学计算
boxed 8 获得包装器对象Stream<Integer>
Radom.ints() 8 随机产生数据流,不可分割(无法使用并行流)
并行流 parallel() 8 并行处理
unordered() 8 不排序

1. 创建Stream

方法名 JDK版本 备注
of(T… ) 8
empty() 8 创建空的Stream流
generate() 8 生成无限流
iterate() 9 创建无限流
ofNullable() 9 类似于Optional ofNullable()
public class MyStreamTest {@Testpublic void test01() {List<Integer> list = Arrays.asList(1, 2, 3);Stream<Integer> stream = list.stream();Stream<Integer> stream1 = Stream.of(1, 2, 3);Stream<List<Integer>> stream2 = Stream.empty();Stream<String> generate = Stream.generate(() -> "Hello World");Stream<Double> generate1 = Stream.generate(Math::random);Stream<BigInteger> iterate = Stream.iterate(BigInteger.ONE, i -> i.add(BigInteger.ONE));// JDK9 优化有限流// Stream<BigInteger> iterate2 = Stream.iterate(BigInteger.ONE, i -> i.compareTo(new BigInteger("100")) < 0,i -> i.add(BigInteger.ONE));// Stream.ofNullable(); JDK9增强generate.forEach(System.out::println);}
}

2. 映射和过滤

方法名 JDK版本 备注
filter() 8 过滤
map[int double long]() 8 一一映射
flatMap[int double long]() 8 1、一对多映射

流如果是empty()创建的则不会通过map,如果流中包含null则会通过map

public class MyStreamTest {@Testpublic void test05() {Stream<String> stream = Stream.of("Hello", "World");stream.filter(i -> i.length() > 3).map(String::toUpperCase).forEach(System.out::print);stream = Stream.of("Hello", "World");stream.flatMap(s -> {String[] array = s.split("");return Stream.of(array);}).forEach(System.out::println);stream = Stream.empty();stream.map(i -> {System.out.println("不会通过");return i;});}
}

3. 抽取流和组合流

方法名 JDK版本 备注
limit() 8 限制输出个数
skip() 8 跳过前几个,和limit互补
takeWhile() 9 当满足条件留下
dropWhile() 9 满足条件丢弃
concat() 8 连接两个流,静态方法
public class MyStreamTest {@Testpublic void test03() {Stream<String> stream = Stream.of("Hello", "World");stream.limit(2).skip(0).forEach(System.out::println);Stream<String> stream1 = Stream.of("Hello", "World");Stream<String> stream2 = Stream.of("Hello", "World");Stream<String> stream3 = Stream.concat(stream1, stream2);}
}

4. 其余流的转换

方法名 JDK版本 备注
distinct() 8 去除重复数值
sorted() 8 按照自然顺序排序
peek() 8 一般对元素的内部属性进行调整,类型不发生改变
public class MyStreamTest {@Testpublic void test04() {Stream<String> stream = Stream.of(null, "Hello", "World");stream.distinct().sorted(String::compareToIgnoreCase)  // 忽略大小写.peek(s -> System.out.println(s.toUpperCase())).forEach(System.out::println);}
}

5. 结束操作(约简操作)

方法名 JDK版本 备注
max() 8 最大值
min() 8 最小值
count() 8 统计数量
findFirst 8 找出第一个,返回Optional
findAny 8 找出任意一个,返回Optional
anyMatch 8 任意一个匹配,boolean
allMatch 8 全部匹配,boolean
noneMatch 8 没有匹配的,boolean
public class MyStreamTest {public void test05() {Stream<Integer> stream = Stream.of(11, 2, 49, 4, 34);Optional<Integer> max = stream.max(Comparator.reverseOrder());Optional<Integer> min = stream.min(Comparator.naturalOrder());long count = stream.count();Optional<Integer> first = stream.findFirst();Optional<Integer> any = stream.parallel().findAny();boolean anyMatch = stream.parallel().anyMatch(integer -> integer > 5);boolean allMatch = stream.parallel().allMatch(integer -> integer > 0);boolean noneMatch = stream.parallel().noneMatch(i -> i > 100);}
}

reduce

方法名 JDK版本 备注
reduce(accumulator) 8 执行累加,返回Optional
reduce(identify, accumulator) 8 带有幺元数,返回固定值
reduce(identify, accumulator, combiner) 8 累加器和组合器
public class MyStreamTest {@Testpublic void test10() {Stream<Integer> stream = Stream.of(1, 2, 3);Optional<Integer> reduce = stream.reduce((integer, integer2) -> integer + integer2);Integer reduce1 = stream.reduce(0, Integer::sum);Stream<String> stringStream = Stream.of("Hello", "World");Integer reduce2 = stringStream.reduce(0, (total, word) -> total + word.length(), (t1, t2) -> t1 + t2);}
}

6. 收集操作

方法名 JDK版本 备注
forEach() 8 遍历所有流元素
toArray([Integer[]::new]) 8 转为类型对象数组。默认为Object数组
collect(Collectors.toList()) 8 转为list
collect(Collectors.toSet()) 8 转为Set
collect(Collectors.toCollection()) 8 转为自定义集合
collect(Collectors.summarizingInt()) 8 转为数学统计对象
public class MyStreamTest {@Testpublic void test06() {Stream<Integer> stream = Stream.of(1, 2, 3);stream.forEach(System.out::println);Object[] objects = stream.toArray();Integer[] array = stream.toArray(Integer[]::new);int[] array1 = stream.mapToInt(Integer::intValue).toArray();List<Integer> collect = stream.collect(Collectors.toList());Set<Integer> collect1 = stream.collect(Collectors.toSet());TreeSet<Integer> collect2 = stream.collect(Collectors.toCollection(TreeSet::new));IntSummaryStatistics statistics = stream.collect(Collectors.summarizingInt(Integer::intValue));statistics.getMin();statistics.getMax();statistics.getCount();statistics.getAverage();statistics.getSum();}
}

映射到表中

方法名 JDK版本 备注
toMap(key, value) 8 冲突会报错
toMap(key, value, overload) 8 指明冲突后value的取值
toMap(key, value, overload / exception, TreeMap::new) 8 指定映射表的类型
public class MyStreamTest {@Testpublic void test07() {Stream<Person> personStream = Stream.of(new Person(1L, "男", "小明"), new Person(2L, "女", "小红"));Map<Long, String> collect = personStream.collect(Collectors.toMap(Person::getId, Person::getName));Map<Long, Person> map = personStream.collect(Collectors.toMap(Person::getId, Function.identity()));Map<Long, Person> map2 = personStream.collect(Collectors.toMap(Person::getId, Function.identity(), (person, person2) -> person));TreeMap<Long, Person> map3 = personStream.collect(Collectors.toMap(Person::getId, Function.identity(), (person, person2) -> {throw new IllegalStateException();}, TreeMap::new));}
}

7. 分组和分区

方法名 JDK版本 备注
groupingBy() 8 分组
partitionBy() 8 分区
public class MyStreamTest {@Testpublic void test08() {Stream<Person> personStream = Stream.of(new Person(1L, "男", "小明"), new Person(2L, "女", "小红"));Map<String, List<Person>> collect = personStream.collect(Collectors.groupingBy(Person::getGender));Map<Boolean, List<Person>> collect1 = personStream.collect(Collectors.partitioningBy(person -> person.getId() > 1));}
}

下游收集器

方法名 JDK版本 备注
groupingBy(Person::getGender, Collectors.toSet()) 8 分组结果为Set去重
groupingBy(Person::getGender, Collectors.counting()) 8 分组结果进行计数
groupingBy(Person::getGender, Collectors.summingLong(Person::getId)) 8 分组结果求和
groupingBy(Person::getGender, Collectors.summarizingLong(Person::getId)) 8 分组结果转为数学统计
groupingBy(Person::getGender, Collectors.maxBy(Comparator.comparing(Person::getName) 8 分组结果求取最大值
groupingBy(Person::getGender, Collectors.minBy(Comparator.comparing(Person::getName)) 8 同上,最小值
groupingBy(Person::getGender, Collectors.collectingAndThen(Collectors.toSet(), Set::size)) 8 先收集在转换
groupingBy(Person::getGender, Collectors.mapping(Person::getName, Collectors.toSet())) 8 先转换在收集

同样适用于partitionBy()

public class MyStreamTest {@Testpublic void test09() {Stream<Person> personStream = Stream.of(new Person(1L, "男", "小明"), new Person(2L, "女", "小红"));Map<String, Set<Person>> collect = personStream.collect(Collectors.groupingBy(Person::getGender, Collectors.toSet()));Map<String, Long> collect1 = personStream.collect(Collectors.groupingBy(Person::getGender, Collectors.counting()));Map<String, Long> collect2 = personStream.collect(Collectors.groupingBy(Person::getGender, Collectors.summingLong(Person::getId)));Map<String, LongSummaryStatistics> collect3 = personStream.collect(Collectors.groupingBy(Person::getGender, Collectors.summarizingLong(Person::getId)));Map<String, Optional<Person>> collect4 = personStream.collect(Collectors.groupingBy(Person::getGender, Collectors.maxBy(Comparator.comparing(Person::getName))));Map<String, Optional<Person>> collect5 = personStream.collect(Collectors.groupingBy(Person::getGender, Collectors.minBy(Comparator.comparing(Person::getName))));// 去重复操作 先收集到Set在统计Map<String, Integer> collect6 = personStream.collect(Collectors.groupingBy(Person::getGender, Collectors.collectingAndThen(Collectors.toSet(), Set::size)));Map<String, Set<String>> collect7 = personStream.collect(Collectors.groupingBy(Person::getGender, Collectors.mapping(Person::getName, Collectors.toSet())));}
}

8. 基本类型流

方法名 JDK版本 备注
range 8 获取一定范围内的数据流
rangeClosed 8 同上,闭区间
of 8 直接创建数据流
toArray() 8 转为int[]
sum / average/ min / max 8 计算结果
summaryStatistics 8 数学计算
boxed 8 获得包装器对象Stream<Integer>
Radom.ints() 8 随机产生数据流,不可分割(无法使用并行流)
public class MyStreamTest {@Testpublic void test11() {IntStream stream = IntStream.of(1, 2, 3, 4);IntStream intStream = IntStream.rangeClosed(0, 10);int[] ints = stream.toArray();int sum = stream.sum();IntSummaryStatistics statistics = stream.summaryStatistics();long sum1 = statistics.getSum();Stream<Integer> boxed = intStream.boxed();String str = "Hello World";IntStream chars = str.chars();IntStream points = str.codePoints();List<Character> collect = chars.mapToObj(operand -> (char) operand).collect(Collectors.toList());Random random = new Random();IntStream stream1 = random.ints(0, 10);DoubleStream doubleStream = random.doubles(0, 10);}
}

9. 并行流

方法名 JDK版本 备注
parallel() 8 并行处理
unordered() 8 不排序

并行流 只要在终结方法之前处于并行状态,所有的中间操作都会被认定为并行操作,并不是所有的流都可以用来加速操作。

  1. 并行化会带来更大的资源损耗问题
  2. 只有底层的数据源可以被有效分割的时候并行化才有意义 Random.ints()产生的流不可分割,转为使用SplittableRandom.ints()
  3. 并行流使用的线程池可能会由于处理密集操作而其他IO操作被阻塞死
public class MyStreamTest {@Testpublic void test12() {Stream<String> stringStream = Stream.of("Hello", "World");// 无状态 不会处于并发安全问题Map<Integer, Long> collect = stringStream.parallel().filter(s -> s.length() > 3).collect(Collectors.groupingBy(String::length, Collectors.counting()));// 当对顺序要求不高的时候, 效率更高Stream<String> limit = stringStream.parallel().unordered().limit(10);}
}

JDK Stream相关推荐

  1. 深度掌握 Java Stream 流操作,让你的代码高出一个逼格

    概念 Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选.排序.聚合等. Stream` 的操作符大体上分为两种:`中间操作符`和`终止操 ...

  2. 这个方法可以让你的代码高出一个逼格——掌握 Java Stream 流操作

    概念 Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选.排序.聚合等. Stream` 的操作符大体上分为两种:`中间操作符`和`终止操 ...

  3. Java Stream的流操作,居然让我的代码越写越丝滑?

    概念 Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选.排序.聚合等. Stream` 的操作符大体上分为两种:`中间操作符`和`终止操 ...

  4. 优雅代码的秘密,只因为我掌握了Java Stream 流操作

    概念 Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选.排序.聚合等. Stream` 的操作符大体上分为两种:`中间操作符`和`终止操 ...

  5. Java8 Stream 流API总结

    Stream API 1.集合处理数据的弊端   当我们在需要对集合中的元素进行操作的时候,除了必需的添加,删除,获取外,最典型的操作就是集合遍历, package com.bobo.jdk.stre ...

  6. Java的HTTP服务端响应式编程

    传统的Servlet模型走到了尽头 传统的Java服务器编程遵循的是J2EE的Servlet规范,是一种基于线程的模型:每一次http请求都由一个线程来处理. 线程模型的缺陷在于,每一条线程都要自行处 ...

  7. react java_独眼巨人React组织了Java 8库的寒武纪爆发

    react java 什么是独眼巨人React? Lambda表达式和默认方法在Java 8中的到来预示了Java语言十年来最大的结构性变化. 在此基础上构建了一些新的很酷的API,例如Stream, ...

  8. java8 streams_当Java 8 Streams API不够用时

    java8 streams Java 8与往常一样是妥协和向后兼容的版本. JSR-335专家组可能尚未与某些读者就某些功能的范围或可行性达成一致的版本 . 请参阅Brian Goetz关于为什么-的 ...

  9. 独眼巨人反应组织了Java 8库的寒武纪爆发

    什么是独眼巨人反应? Lambda表达式和默认方法在Java 8中的出现预示了Java语言十年来最大的结构性变化. 在此基础上构建了一些新的很酷的API,例如Stream, Optional, Com ...

最新文章

  1. 【WPF】MeshGeometry3D中的Normals和TextureCoordinates属性
  2. PLATFORM软件有限公司
  3. npm 安装less插件_node+npm+webpack+less安装
  4. BZOJ 3270: 博物馆
  5. (SPFA+最短路变形+回路对起点的影响)Arbitrage
  6. python中selenium打开浏览器拿不到url_Selenium打开浏览器,但在Chrome和Firefox中都无法获取URL...
  7. java异步处理_Java编程开发好入门吗 消息队列的用途有哪些
  8. 贝塔智能挪车V2.3.4汽车微信小程序 多开版源码
  9. HTML5网页设计基础——播放器图标
  10. 混响延迟插件9个合集 – ValhallaDSP Bundle 2020 WiN 免安装版
  11. 联想服务器bios中文显示,联想bios怎么设置中文显示
  12. 对于计算机系统结构,下列哪些是透明的?(计算机系统结构期末习题解析,史上最全)
  13. 深度精简版xp 安装并使用iis
  14. 库克说他在上大学时学会了编程,你呢?
  15. Windows UI 测试
  16. (转)Spark中对Dataframe的union 、unionAll和 unionByName方法说明
  17. 夫妻给一周岁女儿喂农药后双双自杀
  18. python写音乐_你想过用代码来写音乐吗?我用业余时间开发的一个可以编程写音乐的python库(一)...
  19. SQL SEVER登录失败,无法连接服务器或已成功与服务器建立连接,但是在登录过程中发生错误。(Win10版本,SQL 2019)
  20. java javascript数组_浅谈javascript和java中的数组

热门文章

  1. 关于本号,你想看的都在这里
  2. Matlab——图形绘制——三维立体图形 剔透玲珑球 动态图——彗星状轨迹图
  3. 万字用户画像标签体系建设分析指南!
  4. 程序员,停止你的焦虑
  5. 2019年2月星环科技大数据应用开发面试(2年工作经验)
  6. Android实现控制第三方音乐播放器暂停/播放
  7. 计算机关闭自带杀毒,Win10专业版系统中关闭自带杀毒软件操作方法
  8. 实时数据库数据采集接口API八爪鱼采集接口
  9. android手机获取系统短信sqlite数据库并查看内容
  10. 百度云盘限速破解方式汇总