【发布时间】:2018-06-01 23:55:59
【问题描述】:
我正在用 takeWhile 创建 sn-ps 来探索它的可能性。与 flatMap 配合使用时,行为不符合预期。请在下面找到代码 sn-p。
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
期望的原因是 takeWhile 应该一直执行到内部条件变为真为止。我还在 flatmap 中添加了打印输出语句以进行调试。流仅返回两次,符合预期。
但是,如果链中没有平面图,这也可以正常工作。
String[] strArraySingle = {"Sample3", "Sample4", "Sample5"};
Arrays.stream(strArraySingle)
.takeWhile(ele -> !ele.equalsIgnoreCase("Sample4"))
.forEach(ele -> System.out.println(ele));
实际输出:
Sample3
此处实际输出与预期输出匹配。
免责声明:这些 sn-ps 仅用于代码练习,不提供任何有效的用例。
更新:
错误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);
}
}
【问题讨论】:
标签: java lambda java-stream java-9