使用Integer foo(String s)</integer> </string>将<string>列表到List <integer>

时间:2015-04-18 23:30:45

标签: java list java-8 java-stream

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

foonull的某个元素返回list1时,会抛出NullPointerException。另外,我的解决方案看起来有点不方便。那么有更好的吗?

2 个答案:

答案 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)));