Lmxy1990 ' Blog

java stream 流处理

Java Stream 流处理


jdk1.8之前,处理文字数字都是赋值给相应变量来进行处理.1.8之后,支持是用流来处理.这里的流处理,是对值进行的聚合处理.里面有python的map影子.

  1. 流的列别.
  • IntStream、LongStream、DoubleStream。当然我们也可以用 Stream、Stream >、Stream,但是 boxing 和 unboxing会很耗时.
  1. 流的获取.
    1. 使用集合类.Collection.stream() 或者Collection.parallelStream()
    2. 通过数组获取.Arrays.stream(T array) or Stream.of()
    3. 通过java的IO.java.io.BufferedReader.lines()
    4. 静态工厂.java.util.stream.IntStream.range()java.nio.file.Files.walk()
    5. 自己构建. java.util.Spliterator
    6. 其他:
      • Random.ints()
      • BitSet.stream()
      • Pattern.splitAsStream(java.lang.CharSequence)
      • JarFile.stream()
  2. 流处理的分类
    • Intermediate:
      • 一个流可以后面跟随零个或多个 intermediate 操作。其目的主要是打开流,做出某种程度的数据映射/过滤,然后返回一个新的流,交给下一个操作使用。这类操作都是惰性化的(lazy),就是说,仅仅调用到这类方法,并没有真正开始流的遍历。
      • 包含:map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unordered
    • Terminal:
      • 一个流只能有一个 terminal 操作,当这个操作执行后,流就被使用“光”了,无法再被操作。所以这必定是流的最后一个操作。Terminal 操作的执行,才会真正开始流的遍历,并且会生成一个结果,或者一个 side effect。
      • 包含:forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator
    • short-circuiting:
      • 当操作一个无限大的 Stream,而又希望在有限时间内完成操作,则在管道内拥有一个 short-circuiting 操作是必要非充分条件.
      • 包含:anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 limit

常见的流操作

  1. 查询流里面元素是否为null
    Arrays.asList("小明", "小王", "小李").stream().findAny().ifPresent(System.out::print);

Arrays.asList("小明", "小王", "小李").stream().findFirst().ifPresent(System.out::print);

2.匹配
Arrays.asList("小明", "小王", "小李").stream().anyMatch(s -> s.equals("小王"))

Arrays.asList("小明", "小王", "小李").stream().allMatch(s -> s.equals("小王")) ;

Arrays.asList("小明", "小王", "小李").stream().noneMatch(s -> s.equals("小王")) ;

3.过滤
Arrays.asList("小明", "小王", "小李").stream().filter(va -> !va.equals("小王")).forEach(System.out::print);

4.映射(1对1)
Arrays.asList("小明", "小王", "小李").stream().map(va -> "打豆豆" + va ).forEachOrdered(System.out :: print);

5.映射(多对一)

1
2
3
4
5
Arrays.asList(
Arrays.asList("小明"),
Arrays.asList("小明", "小王"),
Arrays.asList("小明", "小王", "小李")
).stream().flatMap(va -> va.stream().map(a -> a + "不打豆豆")).forEach(s -> System.out.println(s + "了"));

6.排序
Arrays.asList(1, 2, 3).stream().sorted(Comparator.naturalOrder()) ;

Arrays.asList(1, 2, 3).stream().sorted(Integer::compareTo) ;

7.截取(limit是截取前N个,skip是丢弃前N个)
Arrays.asList("小明", "小王", "小李").stream().limit(2).forEach(System.out::print);

Arrays.asList("小明", "小王", "小李").stream().skip(2).forEach(System.out::print);

8.组合 (组合的第一个参数代表截止条件,第二个代表依次处理数据的方法) 类似与python的reduce.只是传参的方式不一样.使用组合可以实现字符串连接,取最大值,最小值,排序..
String reduce = Arrays.asList("小明", "小王", "小李").stream().reduce("", (v1, v2) -> v1 + v2);

Integer reduce = Arrays.asList(1, 2, 3).stream().reduce(Integer.MAX_VALUE, Integer::min);

附录:

参考文档:链接地址


End

坚持原创技术分享,您的支持将鼓励我继续创作!