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
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
Podobne pytania
Nowe pytania
java
Java to język programowania wysokiego poziomu. Użyj tego tagu, jeśli masz problemy z używaniem lub zrozumieniem samego języka. Ten tag jest rzadko używany samodzielnie i jest najczęściej używany w połączeniu z [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] i [maven].
HashMap
- czy toMap<Product, Integer>
?