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

标签 java lambda java-8 java-stream

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

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(", "));
}

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

最佳答案

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

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

我会推荐:

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

万一你不熟悉,看看什么是Ternary Operator ,我将其用作映射器函数的主体。

关于java - 如何通过在数字前添加一个字母来简化接收整数列表并返回字符串的 lambda 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64047008/

相关文章:

java - 在 Action 监听器中使用 Lambda 表达式

java - 使用 lambda 启动线程并调用 join

Java双向链表removeLast()

java - 从另一个类创建对象

c++ - 为什么在 lambda 中通过引用捕获的值被破坏了?

java - 理解java 8流的过滤方法

java - Collectors.toSet() 是否总是返回 HashSet ?什么是契约(Contract)?

java - Logback SMTPAppender 支持环境变量吗?

java - 尽管已在 xml 中初始化,Spring 批处理仍提示 BATCH_JOB_INSTANCE 不存在

java - 使用 java.time 替换时刻中的时间部分