当前位置: 首页 > 知识库问答 >
问题:

当null出现时,如何用流过滤映射?[副本]

鲍驰
2023-03-14

下面是我使用的代码:

Map<Integer, String> map = new HashMap<>(); 
map.put(1, "one"); 
map.put(2, "two"); 
map.put(3, "three"); 
map.put(4, "four"); 

Map<Integer, String> map2 = map.entrySet().stream()
    .filter(e -> e.getKey() > 2)
    .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue()));

System.out.println(map2.toString());

结果正确:

{3=3,4=4}

下面是代码的续写:

map.put(5, null);
map.put(6, "six");

Map<Integer, String> map3 = map.entrySet().stream()
    .filter(e -> e.getKey() > 2)
    .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue()));

System.out.println(map3.toString());

我会预料到结果:

{3=3,4=4,5=null,6=6}

那么,当我将过滤器的谓词中的条件更改为e->e.getKey()<2时,它就会起作用,因为null值不受影响。如何使用stream处理这个问题?null值可能会故意出现在任何地方。我不想使用for循环。stream体系结构难道不应该更“空安全”吗?

我们应该如何管理空值的jdk8流的问题处理了不同的问题。我不想使用.filter(Objects::nonnull),因为我需要保留null值。

请不要用著名标记它为重复,什么是NullPointerException和我如何修复它。我很清楚这一点,我询问使用stream解决方案,它不像for-loop那么低级。这种行为限制了我。

共有1个答案

华化
2023-03-14

可选的是用于包含非空对象的容器对象。可选对象用于表示具有缺省值的null。

您可以这样做:

Map<Integer, Optional<String>> map = new HashMap<>(); 

//Optional.ofNullable - allows passed parameter to be null.
map.put(1, Optional.ofNullable("one")); 
map.put(2, Optional.ofNullable("two")); 
map.put(3, Optional.ofNullable(null)); 
map.put(4, Optional.ofNullable("four")); 

Map<Integer, Optional<String>> map2 = map.entrySet().stream()
        .filter(e -> e.getKey() > 2)
        .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue()));

System.out.println(map2.toString());

测试

{3=Optional.empty, 4=Optional[four]}
 类似资料:
  • 我有一个需要过滤的对象。 我需要输入“数据”,只有“isEnabled”为真的值的ID。

  • 假设我有一张房间清单 每个房间都有一份人员名单。 使用java8 streams,我想迭代房间列表,获取所有人员,在每个节点上执行一些方法(doSomething()),并获取所有过滤对象的列表。 这是使用java 8的最佳实践吗?

  • 我正在用Java8为一个文件编写一个解析器。使用读取该文件,并返回一个顺序的。 每一行都映射到一个数据对象,如下所示: 现在我们可以将流中的每一行映射到相应的结果: 但是,流现在包含要删除的值: 如我在中所知,如果需要结果,我如何组合映射/筛选操作?

  • 我想过滤以下JSON。 我如何将映射函数与过滤器一起使用,而不是。我的想法如下。但它不起作用。 我该怎么办? 谢谢

  • 我有一个对象数组,我想迭代它来生成一个新的过滤数组。但是,我还需要根据参数从新数组中筛选出一些对象。我正在尝试: 这是一个好的方法吗?有更好的方法吗?我愿意使用任何库,比如洛达什。

  • 问题内容: 假设我有课: 我想将其翻译为object : 使用默认的ModelMapper设置,我可以通过以下方式实现: 但是,可能会发生该对象。在这种情况下,MyTarget还将是: 我想以这种方式指定自定义映射,(伪代码): 有人知道如何编写适当的转换器来实现这一目标吗? 问题答案: 无法直接使用ModelMapper,因为ModelMapper 方法会检查source是否为null,在这种情