【问题标题】:List<String> to List<Integer> using Integer foo(String s)List<String> 到 List<Integer> 使用 Integer foo(String s)
【发布时间】:2015-04-18 23:30:45
【问题描述】:

我有一个列表 List&lt;String&gt; (list1) 和一个函数 Integer foo(String s)。使用 Java 8 的强大功能,我想通过将foo 应用于list1 的每个项目,将list1 转换为List&lt;Integer&gt;。以下代码有效,但有一点问题:

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

foolist1的某些元素返回null时,会抛出NullPointerException。此外,我的解决方案看起来有点不方便。那么有没有更好的呢?

【问题讨论】:

    标签: java list java-8 java-stream


    【解决方案1】:

    如果您将其映射到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());
    

    【讨论】:

    • 不写s -&gt; foo(s),也可以写ClassName::foo,其中ClassName是声明foo()的类
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-02-22
      • 1970-01-01
      • 2023-03-26
      • 2022-09-30
      • 2010-09-06
      • 2017-07-18
      • 2017-01-28
      相关资源
      最近更新 更多