我欢迎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。
顺便说一句:很抱歉再次提出问题,但我不知道该如何用不同的字眼准确地查找我的问题... 欢迎发布有用的链接。
感谢您的共享知识:-)
答案 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方法添加它。