【问题标题】:Handle null in stream without filtering处理流中的 null 而不过滤
【发布时间】:2018-06-05 13:42:55
【问题描述】:

我想使用流 API 迭代 Map,但是,如果 null 出现在 EntrySet 的元素中,我想做一些自定义处理。

由于我需要自定义处理空值,我不能只使用Stream::filter

使用我当前的功能 (MyClass::f),

HashMap<String,String> map =new HashMap<>(); 
map.entrySet().stream().map(MyClass::f);

我收到了NullPointerException

【问题讨论】:

  • 您可以将带有 if 语句或三元条件运算符的功能接口传递给您希望将逻辑放入的任何 Stream 操作(map,forEach,...)。跨度>
  • HashMap map =new HashMap(); map .entrySet() .stream() .map(//lambda);这段代码会抛出 NPE ,我想处理 null 并避免 NPE
  • 那与lambda有关。例如,map.entrySet().stream().map(x -&gt; {return x;}); 可以正常工作。
  • @shmosel 我在想 ConcurrentHashMap。 NM - 评论已删除。
  • @midor ,你是对的,它是 lamdba

标签: java java-8 java-stream


【解决方案1】:

map 带有处理null 的函数,并为其他对象返回原始值。

如果没有具体的用例,这是我能提供的最好的:

List<String> s = Arrays.asList("foo", null, "bar", null);
s.stream()
  .map(e -> (e == null) ? "woops, something was null" : e)
  .forEach(System.out::println);

应该给你

foo 
woops, something was null
bar
woops, something was null

【讨论】:

  • 你能在这里提供一些代码吗,我对java8很陌生
  • 当然,如果你提供一个你想要映射的例子。
  • map.entrySet().stream().map() 这段代码给了我 NPE,所以基本上只要 map.entrySet().stream() 为 null 然后打印错误,如果不是null 然后调用 map.entrySet().stream().map(lamdba)
  • 如果没有.map(e -&gt; (e == null) ? "null" : e) 步骤,您的代码将完全一样。 @ManasSaxena:如果 HashMap&lt;String,String&gt; map =new HashMap&lt;&gt;(); map.entrySet() .stream() .map(lambda); 抛出 NPE,lambda 必须是 null。毕竟,空地图中没有nulls,没有终端操作的流甚至没有处理任何元素,如果有的话。
  • 已更新,以明确 map 步骤表示对空值的特殊处理
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-13
  • 2019-06-22
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 2018-11-08
相关资源
最近更新 更多