Лямбда-выражение для поиска карты Java по значению - PullRequest
0 голосов
/ 15 декабря 2018

Мне необходимо реализовать следующий метод, который принимает элемент значения в карте Java и возвращает набор инкапсулирующих в ключ объектов и значений в карте 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;
    }   
}

Я написал следующий метод для поиска набора ключевых элементов на карте, соответствующих переданному значению.

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;
}

Я не уверен, как написать лямбду, чтобы передать keySet на карту и вернуть набор, содержащий совпадающие CacheElement<K,V>.

Я написал следующую неполную лабмду:

    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 в наборе.

Код доступенat: https://github.com/abnig/ancache

Спасибо

Edit-1:

Кэш-карта

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 голосов
/ 15 декабря 2018

В основном вам не хватает collect ( toSet ) и return результата.Вы также можете выполнить всю операцию, комбинируя эту логику со сбором и возвратом, как:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...