Java 8 流 for 循环
Java 8 stream for-loop
我是 Java 8 Streams 的新手,想将以下代码块转换为 Java 8 的 Stream 方式来做同样的事情。
编辑:更新 class-名称以减少混淆。 (删除了 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());
}
}
感谢所有帮助和解释
你可以用 flatMap
来完成:
List<FooBO> list1 = objects.get(1).getObjects().stream()
.flatMap (b -> b.getAffiliates().stream())
.map(BazBo::getPriceList)
.collect(Collectors.toList());
编辑:
由于 objects.get(1).getObjects()
似乎 return 和 List<Object>
,因此需要进行转换。为了安全起见,您还可以添加一个过滤器,确保 Object
s 的类型在转换之前确实是 BarBO
:
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());
编辑:
这是一个带有 class 已编辑问题名称的答案:
List<PriceList> priceLists =
distObjects.stream()
.flatMap (g -> g.getAffiliates().stream())
.map(Affiliate::getPriceList)
.collect(Collectors.toList());
考虑到您的 类(在您提供的示例中并假设它至少可以编译),我真的不明白为什么 flatMap 两次不起作用:
List<BarBO> input = new ArrayList<>();
List<FooBO> result = input.stream()
.flatMap((BarBO token) -> {
return token.getAffiliats().stream();
})
.flatMap((BazBO token) -> {
return token.getPriceList().stream();
})
.collect(Collectors.toList());
我是 Java 8 Streams 的新手,想将以下代码块转换为 Java 8 的 Stream 方式来做同样的事情。
编辑:更新 class-名称以减少混淆。 (删除了 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());
}
}
感谢所有帮助和解释
你可以用 flatMap
来完成:
List<FooBO> list1 = objects.get(1).getObjects().stream()
.flatMap (b -> b.getAffiliates().stream())
.map(BazBo::getPriceList)
.collect(Collectors.toList());
编辑:
由于 objects.get(1).getObjects()
似乎 return 和 List<Object>
,因此需要进行转换。为了安全起见,您还可以添加一个过滤器,确保 Object
s 的类型在转换之前确实是 BarBO
:
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());
编辑:
这是一个带有 class 已编辑问题名称的答案:
List<PriceList> priceLists =
distObjects.stream()
.flatMap (g -> g.getAffiliates().stream())
.map(Affiliate::getPriceList)
.collect(Collectors.toList());
考虑到您的 类(在您提供的示例中并假设它至少可以编译),我真的不明白为什么 flatMap 两次不起作用:
List<BarBO> input = new ArrayList<>();
List<FooBO> result = input.stream()
.flatMap((BarBO token) -> {
return token.getAffiliats().stream();
})
.flatMap((BazBO token) -> {
return token.getPriceList().stream();
})
.collect(Collectors.toList());