默认方法和Lambda供应商回调

时间:2018-10-09 08:45:57

标签: java lambda

我欢迎API中的方法来轻松创建默认初始化。 例如在HashMaps中。但是为什么没有为他们提供Supplier Lambda方法呢? -还是我错过了重要的一步,还是没有学习最新的Java Api版本?

标准(Java8)版本:

Map<String,List<Integer>> datas = new HashMap<>();
List<Integer> integersList = datas.getOrDefault( "somekey", new ArrayList<>() );

无论代码是否需要,只要执行代码,它都会实例化一个新的ArrayList。

所需的Lambda供应商版本:

Map<String,List<Integer>> datas = new HashMap<>();
List<Integer> integersList = datas.getOrDefault( "somekey", ()->new ArrayList() );

仅当所需的键不在映射中时,才会实例化(或执行一些实例化代码)。

getOrDefault() -Method的代码可能如下所示:

public V getOrDefault( K key, Supplier<V> supplier ) {
  if ( !super.containsKey( key ) && supplier != null ) {
    super.put( key, supplier.get() );
  }
  return super.get( key );
}

为什么他们(?)最初不以这种方式构建它,或者后来没有添加这种功能?

我猜想还有更多的示例,其中Lambda可以解决不必要的代码执行-不仅仅是此示例所示的Maps。

顺便说一句:很抱歉再次提出问题,但我不知道该如何用不同的字眼准确地查找我的问题... 欢迎发布有用的链接。

感谢您的共享知识:-)

1 个答案:

答案 0 :(得分:3)

您要寻找的东西自Java 8起就存在。请看一下HashMap的javadoc,尤其是方法Hashmap.computeIfAbsent。如果使用提供的密钥找不到新条目,则此方法允许将新条目添加到HashMap。

例如:

Map<Integer, String> map = new HashMap();
String created = map.computeIfAbsent(1, k -> "Test");
System.out.println(created);

上面的代码将触发HashMap调用提供的Function以添加新条目,因为它找不到现有条目。它既返回新条目,又调用Hashmap.put方法添加它。