代码之家  ›  专栏  ›  技术社区  ›  Dirk Schumacher

默认方法和Lambda供应商回调

  •  0
  • Dirk Schumacher  · 技术社区  · 8 年前

    我欢迎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()

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

    他们为什么(?)最初不是这样构建的,或者后来添加了这样的功能?

    我想还有更多的例子说明Lambda可以解决不必要的代码执行,而不仅仅是这个例子中的映射。

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

    感谢您分享的知识:-)

    1 回复  |  直到 8 年前
        1
  •  4
  •   Gerben Jongerius    8 年前

    您正在寻找的是自Java8以来就存在的。看看HashMap的javadoc,特别是方法 Hashmap.computeIfAbsent 。如果使用提供的键找不到新条目,此方法允许向HashMap添加新条目。

    Examaple:

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

    上面的代码将触发HashMap调用提供的函数来添加新条目,因为它找不到现有条目。它返回新条目并调用Hashmap。放置方法来添加它。