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
相关产品推荐
相关产品推荐

