2015-11-30 2 views
2

Возможно ли заменить обработку, выполненную в этом примере одной инструкцией Java API Stream API, вместо вложенных для циклов?Java 8 Stream API эквивалент вложенных циклов

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 с вы не можете избежать вложенной итерации, так как вы хотите, чтобы произвести aList.size() * bList.size() экземпляры Bean.

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

О, я пытался с помощью двух вызовов flatMap, но не нашел, чтобы гнездиться лямбда. Спасибо :) – Toilal

+1

Оригинал для кода циклов выглядит более чистым, хотя –

+0

Hell eclipse, он хорошо компилируется с Javac и внутри IntelliJ IDEA, но не компилируется с использованием eclipse, потому что он получается как Список вместо списка ... – Toilal

Смежные вопросы