2016-12-29 18 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)で簡単に1つのループを作成できます。これはストリームで可能ですか?

編集:まあ私はこれを行うことができますが、それはflatMapで行うことができますか?

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

ストリームを使用するための何らかの理由はありますか?すべてのループをストリーム操作に移行する必要はありません。 – luk2302

+0

ちょっとしたエクササイズ – user1738539

+1

私はあなたのバージョンをflatMapを使うのが好きです。しかし、私は任意のストリームバージョンより2つのループを好む。 – 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

そうですね。タプルx、yを作成するためにflatMap()を使う方法を理解できませんでした – user1738539

+0

Java8では、コンマのようなペアリング関数をリストのモンダントのペアに持ち上げることはできません。 –

関連する問題