Java 任选地在流API函数调用链的中间调用

Java 任选地在流API函数调用链的中间调用,java,java-stream,Java,Java Stream,我找不到一种方法来使用Streams API,并在聚合操作的“管道”中添加一个短的条件,比如.distinct调用 以下代码显示了如何在条件.distinct调用之后复制.filter调用,使代码比我希望的更详细: AtomicInteger索引=新的AtomicInteger; 供应商nodexSupplier=->myXMLPayload.getNodeXs.stream; //避免节点在有效负载XML测试中重复的错误。 如果NODE_X.lengthe.getSubsubfitofNode

我找不到一种方法来使用Streams API,并在聚合操作的“管道”中添加一个短的条件,比如.distinct调用

以下代码显示了如何在条件.distinct调用之后复制.filter调用,使代码比我希望的更详细:

AtomicInteger索引=新的AtomicInteger; 供应商nodexSupplier=->myXMLPayload.getNodeXs.stream; //避免节点在有效负载XML测试中重复的错误。 如果NODE_X.lengthe.getSubsubfitofNode_X.equalSignoreCaseMargetValue.count{ LOGGER.logLevel.WARNING具有比预期更多的子类型值,因此删除了重复项; nodexSupplier.get 不同的 .filtere->e.GetSubjectOfNode_X.equalsIgnoreCasemyTargetValue .forEachOrderede->{ assertEquals myTargetValue节点未更新为预期值, e、 GetSubsubtofNode_X.getNewValue.toString,节点_X[index.getAndIncrement]; }; }否则{ nodexSupplier.get .filtere->e.GetSubjectOfNode_X.equalsIgnoreCasemyTargetValue .forEachOrderede->{ assertEquals myTargetValue节点未更新为预期值, e、 GetSubsubtofNode_X.getNewValue.toString,节点_X[index.getAndIncrement]; }; } 有没有一种方法可以避免这种情况,而又不违反流规则? 比如:


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

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()]);
       });

但是,您可能需要做一些事情来调用nodexSupplier.get两次…

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

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()]);
       });

但是,您可能希望对调用nodexSupplier.get两次做些什么…

编写一个实用程序方法:

静态流特征流s,布尔值b{ 返回b?s。不同的:s; }
编写一个实用程序方法:

静态流特征流s,布尔值b{ 返回b?s。不同的:s; }
在不违反蒸汽规则的情况下,你这是什么意思?我认为在管道中添加distinct是可以的,这取决于条件。如果您能给出一个具体的示例来说明您正在尝试做什么,这会有所帮助。@WJS这不是一个具体的示例吗?您能无条件地调用.distinct吗?在其他情况下它有害吗?@JohnKugelman-不完全是,我只是想要一个条件来检查bug的存在,并注销它正在做一些特殊的事情,然后我可以标记它,并使用它的非执行来证明bug已经修复,如果它得到修复,我很惊讶我做不到。很容易。不违反蒸汽规则你这是什么意思?我认为在管道中添加distinct是可以的,这取决于条件。如果您能给出一个具体的示例来说明您正在尝试做什么,这会有所帮助。@WJS这不是一个具体的示例吗?您能无条件地调用.distinct吗?在其他情况下它有害吗?@JohnKugelman-不完全是,我只是想要一个条件来检查bug的存在,并注销它正在做一些特殊的事情,然后我可以标记它,并使用它的非执行来证明bug已经修复,如果它得到修复,我很惊讶我做不到。很容易。对不起,我认为它应该工作,但它不是。我得到:java.lang.IllegalStateException:流已被操作或closed@SystemsInCode如果您多次调用,供应商是否返回相同的流?我的答案是基于这样的假设:get每次调用时都返回一个新流。这与伪代码中的相同,我认为它每次都应该返回一个新流实例。对不起,我认为它应该工作,但它不是。我得到:java.lang.IllegalStateException:流已被操作或closed@SystemsInCode如果您多次调用,供应商是否返回相同的流?我的答案是基于这样的假设:get每次调用时都会返回一个新的流。这与伪代码中的情况相同,我认为伪代码每次都会返回一个新的流实例。.实用方法有效,我可以重新分配回原始的pipelineObj没有问题。不知道为什么@Sweeper的答案不起作用。稍后我将再次尝试,看看我是否可以使用这种方法-因为更简洁的实用方法有效,我可以重新分配回原始的pipelineObj,没有问题。不知道为什么@Sweeper的答案不起作用。稍后我会再试一次,看看我是否能将这种方法运用到工作中——更加简洁。。