Collector.toMap 使用泛型

Collector.toMap using generics

我很难在 Java 中使用流式处理 API 进行泛型映射。我有一个以下列方式扩展 LinkedHashMap 的地图

public class LRUCache<K, V> extends LinkedHashMap<K, V> {
  private int size;

  public LRUCache(int size) {
    super(size);
    this.size = size;
  }

  @Override
  protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
    return size() > size;
  }

  public LRUCache<K, V> collect() {
    return entrySet()
        .stream()
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)
    );
  }

}

我正在试验一种虚拟方法 collect,它实际上会在 entrySet 上流式传输,对其应用一些过滤器,然后 return 一个新的 LRUCache,但是 Collectors.toMap 继续抛出一个错误

"Non-static method cannot be referenced from a static context"

我知道这是 Collectors.toMap 泛型定义的一些问题。但是,我无法找出正确的泛型来消除错误并实现流式传输和收集功能

您似乎只是想复制您的 map/cache。流不需要这样做。

添加一个(可能是私有的)构造函数,它调用映射复制构造函数:

private LRUCache(Map<K, V> map, int size) {
  super(map);
  this.size = size;
}

然后在你的收集方法中使用这个:

public LRUCache<K, V> collect() {
  return new LRUCache<>(this, size);
}

或者,不添加构造函数:

public LRUCache<K, V> collect() {    
  LRUCache<K, V> copy = new LRUCache<>(size);
  copy.putAll(this);
  return copy;
}

LinkedHashMap 在其实现中包含一个无参数构造函数,充当 toMap 收集操作 的 供应商。您也可以通过以下方式介绍相同内容:

public LRUCache() {
    this(10); // default size
}

此后,您可以通过以下方式使用 toMap 覆盖 LRUCache::new 供应商来收集 LRUCache 实施:

public LRUCache<K, V> collect() {
    return entrySet().stream()
            .collect(Collectors.toMap(Map.Entry::getKey,
                    Map.Entry::getValue, 
                    (a, b) -> a, LRUCache::new));
}

注意:- 重要的是提供供应商以收集与 HashMap 不同的实现,这是使用 [的其他重载实现得到的=13=].