Lambda表达式以使用值搜索Java Map

时间:2018-12-15 17:57:33

标签: lambda java-8

我必须实现以下方法,该方法接受Java Map中的value元素并返回Map中封装键和值对象的pojo集合。

public Set<CacheElement<K, V>> searchByValue(V v);

CacheElement类如下:

public final class CacheElement<K, V> {

    private final K k;
    private final V v;

    public CacheElement(K k, V v) {
        super();
        this.k = k;
        this.v = v;
    }

    public K getK() {
        return k;
    }

    public V getV() {
        return v;
    }   
}

我编写了以下方法,以在Map中找到与传递的值相对应的键元素集。

public Set<CacheElement<K, V>> searchByValue(V v) {

    Set<K> keySet = this.cacheMap.entrySet().stream()
    .filter(entry -> entry.getValue().equals(v))
    .map(entry -> entry.getKey())
    .collect(Collectors.toSet());

    return null;
}

我不确定如何编写lambda以便将keySet传递给Map并返回包含匹配的CacheElement<K,V>的Set。

我写了以下不完整的Labmda:

    Set<CacheElement<K, V>> elements = this.cacheMap.entrySet().stream()
    .filter(entry ->keySet.contains(entry.getKey()))
    .map(entry -> new CacheElement<K, V>(entry.getKey(), entry.getValue()));

在将新创建的CacheElement对象收集到一个集合中时,我需要帮助。

该代码位于: https://github.com/abnig/ancache

谢谢

编辑1:

cacheMap是

private Map<K, V> cacheMap = new ConcurrentHashMap<K, V>();

当我添加.collect操作数

Set<CacheElement<K, V>> elements = cacheMap.entrySet().stream()
.filter(entry ->keySet.contains(entry.getKey()))
.map(entry -> new CacheElement<K, V>(entry.getKey(), entry.getValue())
.collect(Collectors.toSet()));

然后我得到以下错误:

Type mismatch: cannot convert from Stream<Object> to Set<CacheElement<K,V>> line 92 Java Problem 

The method collect(Collectors.toSet()) is undefined for the type CacheElement<K,V>  line 95 Java Problem

第92行是:Set<CacheElement<K, V>> elements = cacheMap.entrySet().stream()

第95行是:collect(Collectors.toSet()))

编辑2

enter image description here

1 个答案:

答案 0 :(得分:2)

您主要是缺少collect toSet )和return的结果。您还可以确保完成将该逻辑与collect和return as结合起来的完整操作:

public Set<CacheElement<K, V>> searchByValue(V v) {
    return this.cacheMap.entrySet().stream() // assuming Map<K, V> cacheMap
            .filter(entry -> entry.getValue().equals(v)) // filter entries with same value 'v'
            .map(entry -> new CacheElement<>(entry.getKey(), entry.getValue())) // map key and value to CacheElement
            .collect(Collectors.toSet()); // collect as a Set
}