我有一个列表List<String>
(list1
)和一个函数Integer foo(String s)
。利用Java 8的强大功能,我想通过将list1
应用于List<Integer>
的每个项目,将foo
转换为list1
。以下代码有效,但有一点问题:
List<Integer> list2 = list1.stream().mapToInt(s -> foo(s)).boxed().collect(Collectors.toList());
当foo
为null
的某个元素返回list1
时,会抛出NullPointerException
。另外,我的解决方案看起来有点不方便。那么有更好的吗?
答案 0 :(得分:5)
如果您要将其映射到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());
答案 1 :(得分:1)
作为已经给出的答案的替代方案,您可以这样做:
List<Integer> list2 = new ArrayList<>();
list1.forEach(s -> list2.add(foo(s)));