2D-int-Array bedingt mit Streams ausgeben, aber kein if-else oder ternären Operator verwenden

public static void print(int[][] a, char c, char d) {
    Arrays.stream(a).forEach(b ->{
        Map<Boolean, List<Integer>> collect = Arrays.stream(b).mapToObj(i->Integer.valueOf(i)).collect(Collectors.partitioningBy(i->i==1 ));

    } );
}

Könnt ihr mir helfen? Bei 1 soll char c ausgegeben werden, andernfalls char d. Die Reihenfolge soll beibehalten werden. Es sollen nur Stream-Funktionen und es sollen kein if-else und kein ternärer Operator benutzt werden.

1 „Gefällt mir“

Ich nehme an, ein switch statement ist auch nicht erlaubt?

Genau, keine expliziten Fallunterscheidungen.

Suchst du so etwas:

private static char choice(int i, char c, char d) {
    return Optional.of(i).filter(j-> j == 1).map(j-> c).orElse(d);
}

public static void print(int[][] a, char c, char d) {
    Arrays.stream(a).flatMapToInt(Arrays::stream).map(i-> choice(i, c, d))
            .forEach(System.out::print);
}
1 „Gefällt mir“

Genau das meinte ich. Danke!

int[][] a = { { 1, 1, 1 }, { 1, 0, 1 }, { 1, 1, 1 } };
Arrays.stream(a).flatMapToInt(Arrays::stream)
		.map(i -> Optional.of(i).filter(j -> j == 1).map(j -> 'a').orElse(' ')).forEach(System.out::print);

die Ausgabe ist
979797973297979797

was muss ich ändern?

Naja entweder zu char casten oder statt eines chars eben einen String zurückgeben

casten klappt nicht, weder char noch Character.

/e .mapToObj() klappt: Arrays.stream(a).flatMapToInt(Arrays::stream).mapToObj(i -> Optional.of(i).filter(j -> j == 1).map(j -> 'a').orElse(' ')).forEach(System.out::print);.