首先,我要指出,您想要更改的原始代码没有太大的错误。仅仅因为Java有流,你就没有
有
使用它们。
OptionalInt indexOfMatchingItem = IntStream.range(0, tracings.size())
.filter(i -> tracings.get(i).getDestination())
.findFirst();
List newTracings = new ArrayList<>(
indexOfMatchingItem
.map(i -> tracings.subList(0, i + 1))
.orElse(tracings));
上面的内容可以写成一个表达式,但是用一个适当命名的中间变量将其拆分可以使代码自文档化。
tracings
. 如果
是不可变的,可以跳过构建新的ArrayList。
上述解决方案的性能略好于问题中的原始代码,因为ArrayList构造函数预先分配了一个完全符合所需大小的数组,从而避免了调整大小和多个数组副本的开销。
List newTracings =
Stream.concat(
tracings.stream().takeWhile(i -> !tracings.get(i).getDestination()),
tracings.stream().dropWhile(i -> !tracings.get(i).getDestination()).limit(1)
).collect(toList());