2016-12-29 178 views
2

如何使用java流做下列嵌套循环?Java 8流嵌套for循环

for (int x = 0; x < 5; x++) { 
    for (int y = 0; y < 5; y++) { 
     System.out.println(x + ", " + y); 
    } 
} 

我可以很容易地用IntStream.range(0,5)做一个循环。这可能与流?

编辑:好吧我想我可以做到这一点,但可以用flatMap来完成吗?

IntStream.range(0, 5) 
     .forEach(x -> IntStream.range(x, 5).forEach(y -> System.out.println(x + ", " + y))); 
+3

有任何理由使用流?您不必将每个循环迁移到流操作,只是因为您*可以*。 – luk2302

+0

只是一个练习 – user1738539

+1

我更喜欢你的版本,而不是使用flatMap。但我更喜欢任何流版本的两个循环。 – Bohemian

回答

3

你的意思是这样的吗?

IntStream.range(0, 5) 
     .boxed() 
     .flatMap(x -> IntStream.range(0, 5) 
           .mapToObj(y -> new int[] { x, y })) 
     .map(xy -> xy[0] + ", " + xy[1]) 
     .forEach(System.out::println); 

UPDATE

如果阵列被替换为一个实际的对象这将是更好。

IntStream.range(0, 5) 
     .boxed() 
     .flatMap(x -> IntStream.range(0, 5) 
           .mapToObj(y -> new Coord(x, y))) 
     .forEach(System.out::println); 
public final class Coord { 
    private final int x; 
    private final int y; 
    public Coord(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 
    public int getX() { 
     return this.x; 
    } 
    public int getY() { 
     return this.y; 
    } 
    @Override 
    public String toString() { 
     return this.x + ", " + this.y; 
    } 
} 
+0

就是这样。我无法弄清楚如何使用flatMap()来创建元组x,y – user1738539

+0

太糟糕了,您不能像逗号一样将配对函数提升到Java8中的一对列表元素中。 –