2015-11-30 29 views
2

是否可以用单个Java8 Stream API指令代替本示例中执行的处理,而不是嵌套for循环?Java 8 Stream API等价于嵌套for循环

public static void main(String[] args) { 
    List<BeanA> aList = Arrays.asList(new BeanA(), new BeanA(), new BeanA()); 
    List<BeanB> bList = Arrays.asList(new BeanB(), new BeanB(), new BeanB()); 

    List<Bean> result = new ArrayList<>(); 
    for (BeanA a : aList) { 
     for (BeanB b : bList) { 
      result.add(new Bean(a, b)); 
     } 
    } 
    System.out.println("size:" + result.size()); 
    System.out.println("result:" + result); 
} 

public static class BeanA { 
} 

public static class BeanB { 
} 

public static class Bean { 
    private BeanA a; 
    private BeanB b; 

    public Bean(BeanA a, BeanB b) { 
     this.a = a; 
     this.b = b; 
    } 
} 

回答

3

你可以用Stream做吧,但即使Stream是你无法避免嵌套迭代,因为要生产的BeanaList.size() * bList.size()实例。

List<Bean> result = 
    aList.stream() 
     .flatMap(a->bList.stream().map(b->new Bean(a,b))) 
     .collect(Collectors.toList()); 
+0

哦,我试着用2个flatMap调用,但没有嵌套lambdas这样。感谢:) – Toilal

+1

原始循环代码看起来更清洁虽然 –

+0

地狱日食,它与Javac和IntelliJ IDEA内编译良好,但不使用Eclipse编译,因为它的结果是列表,而不是列表 ... – Toilal