Im new to Java 8 Streams and would like to convert following code-block to Java 8's Stream way of doing the same thing.
Edit: Updates the class-names to be less confusing. (Removed Foo, Bar, Baz...)
ArrayList<PriceList> priceLists = new ArrayList<PriceList>();
// I'm casting to a type-safe List from getObjects()
// -which is a function I dont have access to. Is there a nice
// solution to embed this in the stream-syntax?
List<PriceListGroup> distObjects = (List<PriceListGroup>) objects.get(1).getObjects();
for(PriceListGroup group : distObjects) {
Set<Affiliate> affiliates = group.getAffiliates();
for(Affiliate affiliate : affiliates) {
priceLists.add(affiliate.getPriceList());
}
}
All help & explanation appreciated
You can do it with flatMap
:
List<FooBO> list1 = objects.get(1).getObjects().stream()
.flatMap (b -> b.getAffiliates().stream())
.map(BazBo::getPriceList)
.collect(Collectors.toList());
Edit :
Since objects.get(1).getObjects()
seems to return a List<Object>
, a cast is required. To be safe, you can also add a filter that makes sure the type of the Object
s is indeed BarBO
prior to the cast :
List<FooBO> list1 = objects.get(1).getObjects().stream()
.filter (o -> (o instanceof BarBo))
.map (o -> (BarBO)o)
.flatMap (b -> b.getAffiliates().stream())
.map(BazBo::getPriceList)
.collect(Collectors.toList());
EDIT :
Here's an answer with the class names of the edited question:
List<PriceList> priceLists =
distObjects.stream()
.flatMap (g -> g.getAffiliates().stream())
.map(Affiliate::getPriceList)
.collect(Collectors.toList());
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With