Java 如果在内部,则每个循环都要流
我正在尝试将以下代码放入流:Java 如果在内部,则每个循环都要流,java,java-stream,Java,Java Stream,我正在尝试将以下代码放入流: for (Engine engine : engines) { if (engine.getId().equals(rollingStockId)) { return engine; } } for (TrainSet trainSet : trainSets) {
for (Engine engine : engines) {
if (engine.getId().equals(rollingStockId)) {
return engine;
}
}
for (TrainSet trainSet : trainSets) {
if (trainSet.getId().equals(rollingStockId)) {
return trainSet;
}
}
throw new LogicException("there is no train-set or engine with ID "+ rollingStockId);
我尝试了return engines.stream.filterengine->engine.getId.equalsrollingStockId;还有其他一些变体,但都不起作用。我对streamapi比较陌生。这样做有可能或有用吗?您的思路是正确的。首先调用流,然后过滤,然后。像
如果您只希望返回单个项目(本例中的第一个项目),则需要: return engines.stream.filtere->e.getId.equalsrollingStockId.findFirst;
请注意,findFirst将在示例中返回一个可选选项。如果在未找到匹配项的情况下预期返回值为null,请添加另一个OrelSelsNull调用。但通常情况下,最好通过使用可选类型来明确缺少值的可能性。如果要将任何其他对象构造为回退值,请熟悉OrelGet方法,该方法需要lamdba,因此会根据原始for循环后面的内容延迟计算或OrelsNull。如果集合中没有与条件匹配的项,get将引发异常。OP中缺少该信息。可能会出现异常,但OrelSetThrow更显式,或者null也可能是有效的返回值,甚至可能是空的引擎实例OrelSetEngine::newThank you。如果找不到匹配项,则不应返回任何内容。如何做到这一点?我已经编辑了我的原始问题,以澄清我的问题。@DonaldDuck在这种情况下,有一个API可以执行OrelThow而不是get。
return engines.stream()
.filter(engine -> engine.getId().equals(rollingStockId))
.findFirst()
.get(); // <-- but better to return the Optional type.