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=].
我很难在 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=].