我不能找到一种方法,使用流API ,并有一个简短的条件除了像.distinct()调用的合计操作的“管道”。
下面的代码显示了我如何在有条件的 .distinct() 调用之后复制 .filter 调用,使代码比我想要的更冗长:
AtomicInteger index = new AtomicInteger();
Supplier<Stream<NodeXType>> nodexSupplier = () -> myXMLPayload.getNodeXs().stream();
// Avoid BUG where the NodeXs are duplicated in the Payload XML impacting tests.
if (NODE_X.length < nodexSupplier.get().filter(e -> e.getSubTypeofNode_X().equalsIgnoreCase("myTargetValue")).count()){
LOGGER.log(Level.WARNING, "had more sub-type values than expected, so removed duplicates");
nodexSupplier.get()
.distinct()
.filter(e -> e.getSubTypeofNode_X().equalsIgnoreCase("myTargetValue"))
.forEachOrdered(e -> {
assertEquals(" myTargetValue nodes not updated to expected value",
e.getSubTypeofNode_X().getNewValue().toString(), NODE_X[index.getAndIncrement()]);
});
} else {
nodexSupplier.get()
.filter(e -> e.getSubTypeofNode_X().equalsIgnoreCase("myTargetValue"))
.forEachOrdered(e -> {
assertEquals(" myTargetValue nodes not updated to expected value",
e.getSubTypeofNode_X().getNewValue().toString(), NODE_X[index.getAndIncrement()]);
});
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在不违反 Streams 规则的情况下避免这种情况?喜欢:
pipelineObj = Source.stream()
if (condition) {pipelineObj.distinct}
pipelineObj.filter{}...
Run Code Online (Sandbox Code Playgroud)
只要您不在单个流上多次执行终端操作,就可以将流放入变量中:
Stream<NodeXType> pipelineObj = nodexSupplier.get();
if (NODE_X.length < nodexSupplier.get().filter(e -> e.getSubTypeofNode_X().equalsIgnoreCase("myTargetValue")).count()) {
pipelineObj = pipelineObj.distinct();
}
pipelineObj
.filter(e -> e.getSubTypeofNode_X().equalsIgnoreCase("myTargetValue"))
.forEachOrdered(e -> {
assertEquals(" myTargetValue nodes not updated to expected value",
e.getSubTypeofNode_X().getNewValue().toString(), NODE_X[index.getAndIncrement()]);
});
Run Code Online (Sandbox Code Playgroud)
但是,您可能想要做一些关于调用nodexSupplier.get()两次的事情......