【问题标题】:How to make `Map::get` return either an `Optional` of the found value or `Optional.empty()`如何使`Map::get`返回找到值的`Optional`或`Optional.empty()`
【发布时间】:2018-11-01 20:10:43
【问题描述】:

我正在尝试这样做:

return Optional.of(myMap.getOrDefault(myKey, null));

真的,如果找到,我想要返回Optional.of(foundVal),否则返回Optional.empty()。我不相信Optional.of(null) 等同于此。我想做什么语法?

也就是说,我怎样才能获得地图get 以返回正确的Optional

【问题讨论】:

  • Optional#ofNullable,或者更好的是,如果密钥不存在,您可以执行一些操作,例如Map#computeIfAbsent
  • 但是想想 null,null 可能意味着值不存在或键实际上映射到 null,这取决于您的地图和应用程序
  • @Eugene - 谢谢。是的,我自己从流中构建地图,所以如果该值不存在,那么该条目也永远不会存在。不过,我正在尝试涵盖所有空案例。

标签: java java-8 optional


【解决方案1】:

为什么不简单:

return Optional.ofNullable(myMap.get(myKey));

JavaDocs

【讨论】:

    【解决方案2】:

    这个

    Optional.of(myMap.getOrDefault(myKey, null));
    

    真的

    Optional.of(null);
    

    会因NullPointerException 而失败。正如javadoc 所述

    抛出:
    NullPointerException - 如果value 为空

    Optional#ofNullable 在您不知道您传递给它的值是否为null 时存在:

    参数
    value - 要描述的可能为空的值

    因为Map#get(Object) 已经在给定键没有条目时返回null

    退货
    指定键映射到的值,或者 null 如果 此映射不包含键的映射

    您不需要将getOrDefaultnull 值一起用作默认值。您可以直接使用

    Optional.ofNullable(myMap.get(myKey));
    

    【讨论】:

      【解决方案3】:

      实用且绝对太长的解决方案:

      myMap.entrySet().stream()
        .filter(it -> it.getKey().equals(myKey))
        .findFirst()
        .map(Map.Entry::getValue);
      

      【讨论】:

      • 非常糟糕的主意,因为这不会利用地图的索引并进行完整的地图扫描
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-23
      • 1970-01-01
      • 2022-11-19
      • 2021-09-27
      • 1970-01-01
      • 2021-06-16
      • 2016-08-25
      相关资源
      最近更新 更多