java - 使用泛型的 Collector.toMap

标签 java generics java-stream collectors

我很难在 Java 中使用流 API 来实现泛型映射。我有一个 map ,它通过以下方式扩展 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上进行流式传输,对其应用一些过滤器,然后返回一个新的LRUCache,但是Collectors.toMap保留抛出一个错误,上面写着

“不能从静态上下文引用非静态方法”

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

最佳答案

LinkedHashMap 在其实现中包含一个无参构造函数,充当toMap 收集操作的提供者。您也可以通过包含以下内容来引入相同的内容:

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

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

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

注意:- 重要的是提供一个供应商来收集与 HashMap 不同的实现,这是使用 的其他重载实现所得到的。 toMap.

关于java - 使用泛型的 Collector.toMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61159257/

相关文章:

java - Stream.reduce(Float,BinaryOperator) BinaryOperator 指的是哪个功能接口(interface)方法?

java - 为什么Java会在这里抛出NullPointerException?

java - App发布版本中登录配置问题

java.lang.IllegalArgumentException : No matching constant for [0] while using RestTemplate

typescript - 带有通用参数的 typescript 工厂

c# - 如何创建通用列表框对话框控件

java - 在 Java 中使用通用 Pair 类和 Splaytree 来计数和存储单词及其频率

java - Java Stream().noneMatch(...) 和 !stream().anyMatch(...) 之间的区别

Java 图形用户界面组件

java - 如何遍历可选的嵌套列表?