我正在用 take while 创建片段来探索它的可能性。当与 latMap 一起使用时,行为与预期不一致。请找到下面的代码片段。
String[][] strArray = {{"Sample1", "Sample2"}, {"Sample3", "Sample4", "Sample5"}};
Arrays.stream(strArray)
.flatMap(indStream -> Arrays.stream(indStream))
.takeWhile(ele -> !ele.equalsIgnoreCase("Sample4"))
.forEach(ele -> System.out.println(ele));
实际输出:
Sample1
Sample2
Sample3
Sample5
输出:
Sample1
Sample2
Sample3
预期的原因是 take while 应该一直执行,直到内部条件变为 true。我还在 latmap 中添加了打印输出语句,以便进行调试。流只返回两次,这与期望值内联。
但是,在链中不使用平面映射时,这样做就可以很好地工作。
String[] strArraySingle = {"Sample3", "Sample4", "Sample5"};
Arrays.stream(strArraySingle)
.takeWhile(ele -> !ele.equalsIgnoreCase("Sample4"))
.forEach(ele -> System.out.println(ele));
实际输出:
Sample3
这里,实际输出与预期输出相匹配。
免责声明: 这些代码片段只是用于代码练习,不适用于任何有效的用例。
更新:
Bug JDK-8193856: 修复程序将作为 JDK 10的一部分提供。
更改将更正 whileOps
接受
@Override
public void accept(T t) {
if (take = predicate.test(t)) {
downstream.accept(t);
}
}
改变实施方式:
@Override
public void accept(T t) {
if (take && (take = predicate.test(t))) {
downstream.accept(t);
}
}