Java 8 list processing – add elements conditionally

  • A+
Category:Languages

I have the following piece of code:

List<Object> list = new ArrayList<>(); list.addAll(method1()); if(list.isEmpty()) { list.addAll(method2()); } if(list.isEmpty()) { list.addAll(method3()); } if(list.isEmpty()) { list.addAll(method4()); } if(list.isEmpty()) { list.addAll(method5()); } if(list.isEmpty()) { list.addAll(method6()); } return list; 

Is there a nice way to add elements conditionally, maybe using stream operations? I would like to add elements from method2 only if the list is empty otherwise return and so on.

Edit: It's worth to mention that the methods contain heavy logic so need to be prevented from execution.

 


I would simply use a stream of suppliers and filter on List.isEmpty:

Stream.<Supplier<List<Object>>>of(() -> method1(),                                    () -> method2(),                                    () -> method3(),                                    () -> method4(),                                    () -> method5(),                                    () -> method6())     .map(Supplier<List<Object>>::get)     .filter(l -> !l.isEmpty())     .findFirst()     .ifPresent(list::addAll);  return list; 

findFirst() will prevent unnecessary calls to methodN() when the first non-empty list is returned by one of the methods.

EDIT:
As remarked in comments below, if your list object is not initialized with anything else, then it makes sense to just return the result of the stream directly:

return  Stream.<Supplier<List<Object>>>of(() -> method1(),                                            () -> method2(),                                            () -> method3(),                                            () -> method4(),                                            () -> method5(),                                            () -> method6())     .map(Supplier<List<Object>>::get)     .filter(l -> l.isEmpty())     .findFirst()     .orElseGet(ArrayList::new); 

Comment

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