Sky*_*ech 8 java lambda filter java-8 java-stream
我想优化下面的代码来获取现有的ArrayList并根据以下逻辑创建一个新列表.Java 8中的streaming/lambda是否可以实现?
for (ShipmentTracingDTO tracing : tracings) {
if (tracing.getDestination()) {
newTracings.add(tracing);
break;
}
newTracings.add(tracing);
}
Run Code Online (Sandbox Code Playgroud)
您可以使用IntStream.range并List.subList可能执行以下操作:
List<ShipmentTracingDTO> newTracings = tracings.subList(0, IntStream.range(0, tracings.size())
.filter(i -> tracings.get(i).getDestination())
.map(a -> a + 1) // to include the index of occurrence
.findFirst()
.orElse(tracings.size())); // else include all until last element
Run Code Online (Sandbox Code Playgroud)
注意:这只是一个视图,tracings因此更改基础列表tracings也会反映出更改newTracings.如果要将这些解耦,可以new ArrayList<>()从解决方案中创建一个.
编辑:在Holger的评论中,您可以选择使用:
List<ShipmentTracingDTO> newTracings = IntStream.rangeClosed(1, tracings.size())
.filter(i -> tracings.get(i - 1).getDestination()) // i-1 to include this as well
.mapToObj(i -> tracings.subList(0, i)) // Stream<List<ShipmentTracingDTO>>
.findFirst() // Optional<List<ShipmentTracingDTO>>
.orElse(tracings); // or else the entire list
Run Code Online (Sandbox Code Playgroud)