You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java17能否使用flatMap实现Optional<Integer>列表的求和功能

Java 17 使用 flatMap 实现等效字符串转整数求和功能

可以实现,Java 17 完全支持该操作。

实现思路

利用 Optional 的 stream() 方法,可以直接将 Optional 实例转换为长度为 0 或 1 的 Stream:如果 Optional 为空则返回空 Stream,有值则返回仅包含该值的 Stream。配合 Stream 的 flatMap 操作,就能直接过滤掉转换失败的空值,直接对有效数值求和,和原有逻辑结果完全一致(转换失败的项等价于加 0,不影响求和结果)。

完整简化代码

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

class FirstClass {
    static String[] a = new String[] { "1", "2", "three", "4", "one hundred seventy five" };
    static List<String> myList = Arrays.asList(a);

    public static Optional<Integer> toInt(String in) {
        try {
            return Optional.of(Integer.parseInt(in.trim()));
        } catch (NumberFormatException e) {
            return Optional.empty();
        }
    }

    public static void main(String[] args) {
        int sum = myList.stream()
                .flatMap(item -> toInt(item).stream())
                .mapToInt(Integer::intValue)
                .sum();
        System.out.println(sum);
    }
}

对齐原有流程的分步实现

如果你需要保留先生成中间列表再求和的流程,也可以按如下方式实现:

// 第一步生成有效整数列表
List<Integer> validIntList = myList.stream()
        .flatMap(item -> toInt(item).stream())
        .toList();

// 第二步求和
int sum = validIntList.stream().mapToInt(Integer::intValue).sum();

上述两种实现和原有代码的最终输出完全一致,结果都为 7。

内容的提问来源于stack exchange,提问作者jhon.smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:54:03