Java 9 Stream新增方法takeWhile的bug

时间:2022-06-17 16:19:13

Java 9的Stream新增方法takeWile():允许我们返回Stream里满足条件的前面部分元素。

如:

String[] arr= {"a", "b", "c","d"};
Arrays.stream(arr)
        .takeWhile(e -> !e.equalsIgnoreCase("c"))
        .forEach(e-> System.out.println(e));

条件为判断字符串和“c”比较,不想等返回true。结果返回a和b,输出:

a
b

bug

但使用flatMap对元素展开返回的元素做takeWhile,返回结果有误:

String[][] ss = {{"a", "b"}, {"c", "d"}}; 
  Stream.of(ss)
    .flatMap(Arrays::stream)
    .takeWhile(e -> e.equalsIgnoreCase("c"))
    .forEachOrdered(System.out::println); 

实际输出:

a
b
d 

与期待输出的a和b不一致。

这个bug会在JDK 10修复:https://bugs.openjdk.java.net/browse/JDK-8193856