Lets say we have this boring piece of code that we all had to use:
ArrayList ids = new ArrayList();
for (MyObj obj : myList){
ids.add
I use a lot of collector blocks where I create an empty Array and fill it using a loop so I decided I need a utility class of my own not to write the same lines again ad again, here it is:
public class Collections {
public static List collect(Set items, Function super O, ? extends T> mapper) {
return items.stream().map(mapper).collect(Collectors.toCollection(ArrayList::new));
}
}
and use it like this
List prods = Collections.collect(basket.getOrderItems(), OrderItem::getProduct);
or like this
List prods = Collections.collect(basket.getOrderItems(), (item)->item.getProduct().getId());
Though it might look like much more easier to read, it seems streams are a little slower in these kind of scenarios, look here