Mam hashmap z kluczem jako obiektem poniżej

Chcę móc iterować przez hashmap i pobierać wartości tylko dla kluczy pasujących do nazwy i drugiej wartości w symbolu, tj. Lmn, hij

Przykład: jeśli wejście to pqr i hij , wynik powinien zwrócić 500. Chcę móc to zrobić za pomocą Java Stream API

class Product {
   String name;
   String symbol;
}

Przykładowe wartości

    KEY.               VALUE
name symbol
abc  12|lmn|standard   1000
pqr  14|hij|local      500
0
Niki 20 listopad 2019, 23:54
Jeśli chcesz wyszukać konkretny klucz w hashmapie, nie musisz iterować po hashmapie. Po prostu wyszukaj ten konkretny klucz. Po to są hashmapy. Gdzie jest twój hashmap i jakie masz trudności?
 – 
khelwood
20 listopad 2019, 23:59
To nie jest konkretny klucz, jego nazwa i część symbolu, który muszę dopasować
 – 
Niki
21 listopad 2019, 00:01
Przydałoby się zobaczyć definicję kodu twojego HashMap - czy to Map<Product, Integer>?
 – 
MyStackRunnethOver
21 listopad 2019, 23:24

1 odpowiedź

Szybko i brudno:

map.entrySet().stream()
    .filter(e -> e.getKey().name.equals(nameMatch))
    .filter(e -> e.getKey().symbol.contains("|" + keyMatch + "|"))
    .map(e -> e.getValue()).findFirst().orElse(null);

Być może lepiej jest po prostu utworzyć predykat, który sprawdza produkt:

Predicate<Product> matcher = matcher(nameMatch, symbolMatch);
Integer result = map.entrySet().stream()
    .filter(e -> matcher.test(e.getKey()))
    .map(e -> e.getValue()).findFirst().orElse(null);

...

private static Predicate<Product> matcher(String name, String symbolPart) {
    String symbolMatch = "|" + symbolPart + "|";
    return product -> product.name.equals(name) &&
        product.symbol.contains(symbolMatch);
}

1
boot-and-bonnet 21 listopad 2019, 00:41
Dziękuję. Ale chcę również przeszukać pole nazwy. A jak go zebrać?
 – 
Niki
21 listopad 2019, 00:16
Edytowane - patrz wyżej. Jeśli to nie działa, czy możesz wyjaśnić, czy wynik jest błędny, czy zgłasza wyjątek, dzięki
 – 
boot-and-bonnet
21 listopad 2019, 00:42