Using streams, lambda in java 8

  • A+

I would like to optimize the below code to take an existing ArrayList and make a new list based on the below logic. Does streaming/lambda in Java 8 make it possible?

for (ShipmentTracingDTO tracing : tracings) {     if (tracing.getDestination()) {         newTracings.add(tracing);         break;     }     newTracings.add(tracing); } 


You can do it using IntStream.range and List.subList possibly as :

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 

Note: This is just a view of tracings and hence changing the underlying list tracings would also reflect in changes in newTracings. If you want to decouple these, you can create a new ArrayList<>() from the solutions.

Edit: In comments from Holger, you could alternatively use:

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 


:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: