使用 Java 8 Stream 将 null 替换为二维字符串数组中的另一个值

Replace null by another value in 2D String array using Java 8 Stream

我想用二维数组中的字符串 Z 替换 null 值。 我有这样的数据:

String[][] userData = { { "User A", "A" }, { null, null }, { "User B", "B" } };

现在我需要像下面这样更改 userData

String[][] userData = { { "User A", "A" }, { "Z", "Z" }, { "User B", "B" } };

如何通过 java 8 流实现此目的并以相同格式(2D 字符串数组)返回结果?

与其尝试使用 lambda 表达式重新生成整个数组,不如使用一对 IntStream.range(int, int) 调用来生成有效的数组索引,然后使用单个 forEach 替换任何 null(s)。喜欢,

String[][] userData = { { "User A", "A" }, { null, null }, { "User B", "B" } };
IntStream.range(0, userData.length).forEach(x -> 
            IntStream.range(0, userData[x].length).forEach(y -> {
    if (userData[x][y] == null) {
        userData[x][y] = "Z";
    }
}));
System.out.println(Arrays.deepToString(userData));

输出(按要求)

[[User A, A], [Z, Z], [User B, B]]

检查这是否适合你

        String[][] userData = {{"User A", "A" }, {null, null}, {"User B", "B" }};
        userData = Arrays.stream(userData).map(arr -> Arrays.stream(arr)
            .map(a -> a!=null ? a : "Z").toArray(String[]::new)).toArray(String[][]::new);

        System.out.println(Arrays.deepToString(userData));
        //[[User A, A], [Z, Z], [User B, B]]

我建议不使用流的解决方案,但需要 java 8+.

List.replaceAll 是在 java 8 中引入的,它接受将应用于列表中每个元素的 UnaryOperator

String[] replace = {null, null};
String[] replaceWith = { "Z", "Z" };

List<String[]> list = Arrays.asList(userData);
list.replaceAll(arr -> Arrays.equals(arr, replace) ? replaceWith : arr);
System.out.println(Arrays.deepToString(list.toArray()));

输出:

[[User A, A], [Z, Z], [User B, B]]