【问题标题】:How to do migration java 7 to java 8 - forEach and return a List<Object> or null if input is null?如何将 java 7 迁移到 java 8 - forEach 并返回 List<Object> 或如果输入为 null 则返回 null?
【发布时间】:2019-09-27 12:05:40
【问题描述】:

我的 java7 代码:

List<Argument<?>> args = expression.match(text);
if (args == null) {
    return null;
} else {
    List<Object> list = new ArrayList<>();
    for (Argument<?> arg : args) {
        list.add(arg.getValue());
    }
    return list;
}

我尝试使用stream + flatMap + map + collect

List<Object> list = args.stream().flatMap(arg -> arg.getValue()).collect(Collectors.toSet());...??

【问题讨论】:

  • args.stream() 将导致 NPE 没有 if(args == null)

标签: java arrays java-8 java-stream


【解决方案1】:
  1. Change flatMap to map
  2. Collectors.toSet() 更改为Collectors.toList()
  3. 我假设检查args == nullargs.stream() 之前完成。否则,您可能会获得 NPE。

List<Argument<?>> args = expression.match(text);
return args == null ?
        null :
        args.stream().map(arg -> arg.getValue()).collect(Collectors.toList());

不过,我不支持返回 null。您可以返回 Collections.emptyList()Optional.empty()

【讨论】:

  • 我也更喜欢 Collections.emptyList()Optional.empty() 但我不是这个选择,因为如果没有匹配项,我的方法的用户想要 null (它是匹配器)
  • @sgrillon 我的回答有问题,所以你改变了主意(不赞成和不接受)?
  • 你的回答很好,谢谢你的贡献。我更喜欢@Naman 的回答,因为他回答得更快,尤其是他到了最重要的地方。
【解决方案2】:

使用map 代替flatMap

return (args == null) ? null : args.stream()
        .map(arg -> arg.getValue())
        .collect(Collectors.toList()); //modified

旁注:不要为List&lt;T&gt; 分配/返回null,而是使用Collections.emptyList()

【讨论】:

  • 我需要返回null,因为我的代码是一个匹配器,如果没有匹配,我的调用者需要有null,否则是匹配列表。
  • 是否可以在同一指令中包含 null 测试,或者我保留if (args == null) {...
猜你喜欢
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-04
  • 2019-08-25
相关资源
最近更新 更多