在java 8中使用streams,lambda

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)

Nam*_*man 9

您可以使用IntStream.rangeList.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)

  • 或者`List <ShipmentTracingDTO> newTracings = IntStream.rangeClosed(1,tracings.size()).fiilter(i - > tracings.get(i - 1).getDestination()).mapToObj(i - > tracings.subList(0 ,i)).findFirst().orElse(tracings);`如果需要新的列表,只需将整个表达式包装在`new ArrayList <>(...)中` (2认同)