Java 8流for循环

hen*_*rik 6 java arrays java-8 java-stream

我是Java 8 Streams的新手,并希望将以下代码块转换为Java 8的Stream方式来做同样的事情.

编辑:更新类名称以减少混淆.(删除了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());
    }
}
Run Code Online (Sandbox Code Playgroud)

所有帮助和解释表示赞赏

Era*_*ran 11

你可以这样做flatMap:

List<FooBO> list1 = objects.get(1).getObjects().stream()
                                  .flatMap (b -> b.getAffiliates().stream())
                                  .map(BazBo::getPriceList)
                                  .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

编辑:

由于objects.get(1).getObjects()似乎返回a List<Object>,需要演员.为了安全起见,您还可以添加一个过滤器,以确保Objects 的类型确实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());
Run Code Online (Sandbox Code Playgroud)

编辑:

以下是已编辑问题的类名的答案:

List<PriceList> priceLists = 
    distObjects.stream()
               .flatMap (g -> g.getAffiliates().stream())
               .map(Affiliate::getPriceList)
               .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

  • @Eran我个人会考虑将列表排除在问题范围之外.在这种情况下,你的第一个答案看起来很棒(用`someList`代替`objects.get(1).getObjects()`. (2认同)
  • @henrik我刚刚注意到我错过了对`getPriceList`的调用.见编辑的答案. (2认同)