java - 映射getOrDefault VS getOrUseSupplier

标签 java lambda functional-programming

我开始学习lambda,而且我不明白为什么Java Map具有:

getOrDefault(Object key, V defaultValue)

而不是(工作原理相同,但是如果缺少值,则将从供应商处获取defaultValue):
getOrUseSupplier(Object key, Supplier<V> defaultValue)

我目前看到的当前解决方案的冒险:
  • defaultValue不必是最终/有效的最终值
  • 看起来更简单,无需了解lambda语法

  • 缺点:
  • 如果在使用getOrDefault时我们放置了新对象创建,则它将立即创建并传递给GC(在使用Supplier时,将完全不会创建)。

  • 我想知道是否还有使用&具有getOrDefault而不是getOrUseSupplier的缺点。您还可以告诉我Java库中是否有这样的方法:
    static <V> V getOrUseSupplier(Map<?, V> map, Object key, Supplier<V> supplier)
    

    试图从 map 上获取值(value),如果不存在,则从供应商那里获取值(value)。

    最佳答案

    getOrUseSupplier()中最接近的Map等效项称为computeIfAbsent(),它允许使用键来计算值,与仅使用Supplier相比,它提供了更大的灵活性。与Map不同,它还将计算的值存储在getOrDefault中。这是因为它们有不同的用例,并没有真正的关联。虽然getOrDefault通常用于返回“安全”非空默认值(例如,返回空字符串而不是null),以指示某些内容应在 map 中,但是computeIfAbsent()表示某些内容必须在 map 中,如果不是,则需要创建它,否则程序的内部状态不正确。

    下面的示例忽略 key ,仅使用供应商的值(value)。

    public static <V,T> V getOrUseSupplier(Map<T, V> map, T key, Supplier<V> supplier) {
        return map.computeIfAbsent(key, k -> supplier.get());
    }
    

    关于java - 映射getOrDefault VS getOrUseSupplier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36742258/

    相关文章:

    scala - 可变变量与可变集合

    java - 使用 Spring 3 启动项目

    c++ - 为什么我可以在 lambda 中使用 ostream cout,尽管它没有被捕获?

    haskell - `data PoE a = Empty | Pair a a` 是单子(monad)吗?

    list - 在一个函数中修改多个列表并在Scala中返回

    c# - 使用反射、链式方法和 lambda 表达式动态创建对象

    java - 如何处理不停止线程的行为不当的库

    java - Spring 3.0.5中如何防止参数绑定(bind)解释逗号?

    java - 拼写检查 - 带有 Java 流的嘈杂 channel 模型

    java - 使用 lambda 重构接口(interface)实现?