List<String> 到 List<Integer> 使用 Integer foo(String s)

List<String> to List<Integer> using Integer foo(String s)

我有一个列表 List<String> (list1) 和一个函数 Integer foo(String s)。使用 Java 8 的力量,我想通过将 foo 应用于 list1 的每个项目,将 list1 转换为 List<Integer>。以下代码有效但有一点问题:

List<Integer> list2 = list1.stream().mapToInt(s -> foo(s)).boxed().collect(Collectors.toList());

fooreturns null 对于 list1 的某个元素时抛出 NullPointerException。此外,我的解决方案看起来有点不方便。那么还有更好的吗?

如果您将其映射到 Integer,我认为不需要使用 mapToInt 然后使用 boxed

相反,您可以简单地使用 map 然后 filter 来排除空值。

List<Integer> list2 =
    list1.stream()
       .map(s -> foo(s))
       .filter(Objects::nonNull)
       .collect(Collectors.toList());

如果要保留列表中的空值,只需删除 filter

List<Integer> list2 =
    list1.stream()
       .map(s -> foo(s))
       .collect(Collectors.toList());

作为已给出答案的替代方法,您可以这样做:

List<Integer> list2 = new ArrayList<>();
list1.forEach(s -> list2.add(foo(s)));