可选择在 Streams API 函数调用链的中间调用 .distinct()

Sys*_*ode 1 java java-stream

我不能找到一种方法,使用流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)

Swe*_*per 5

只要您不在单个流上多次执行终端操作,就可以将流放入变量中:

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()两次的事情......