提问者:小点点

如何通过在数字前添加一个字母来简化接收整数列表并返回字符串的lambda方法?


我想简化这个方法,这样我就不需要ArrayList,也就是说,只有使用lambda,我才能流式传输整数列表,分析谁是偶数或奇数,添加相应的字母并连接成字符串

public static String o1e3method(List<Integer> list) {
    List<String> n = new ArrayList<>(); 
    list.forEach(x -> {
        if (x % 2 == 0) {
            n.add("e" + x);
        }
        else {
            n.add("o" + x);
        }
    });
    return String.join(", ", n);
}

换句话说,我想要的东西是这样的:

public static String o1e3b(List<Integer> list) {
    return list.stream()
        .map(Object::toString)
        .forEach(x -> {
            if (Integer.parseInt(x) % 2 == 0) {
                x = "e" + x;
            }
            else {
                x = "o" + x;
            }
        })
        .collect(Collectors.joining(", "));
}

但是我不能这样做,因为for每是一个void方法,并且不返回要收集的内容。


共3个答案

匿名用户

for每一个是一个终端操作,它不返回Stream。您需要一个中间操作来转换您的数字并返回转换后的流,稍后您将收集这些流。

请注意,您有一个到String的冗余映射,您根本不需要它。

我会推荐:

public static String o1e3b(List<Integer> list) {
    return list.stream()
            .map(x -> x % 2 == 0 ? "e" + x : "o" + x)
            .collect(Collectors.joining(", "));
}

以防您不熟悉,请参阅什么是三元运算符,我将其用作映射器函数的主体。

匿名用户

您可以简单地映射到String:

return list.stream()
            .map(x -> x % 2 == 0 ? "e" + x : "o" + x)
            .collect(Collectors.joining(", "));

匿名用户

你的想法是对的,但是你应该使用map而不是for每。另请注意,没有理由将整数转换为字符串然后再次解析它们:

public static String o1e3b(List<Integer> list) {
    return list.stream()
            .map(x -> {
                if (x %2 == 0) {
                    return "e" + x;
                } else {
                    return "o" + x;
                }
            })
            .collect(Collectors.joining(", "));
}