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());
当 foo
returns 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)));
我有一个列表 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());
当 foo
returns 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)));