it-swarm.com.de

Prüfen Sie in der Map of List, ob ein Wert für den spezifischen Schlüssel Java 8 vorhanden ist

In Java 7 habe ich

Map<String, List<String>> m = new HashMap<String, List<String>>();
boolean result = false;
m.put("Name1", Arrays.asList("abc*1"));
m.put("Name2", Arrays.asList("[email protected]*1"));


for (Map.Entry<String, List<String>> me : m.entrySet()) {
    String key = me.getKey();
    List<String> valueList = me.getValue();
    if (key.equals("Name2"){
        System.out.print("Values: ");
        for (String s : valueList) {
            if(s.contains("@"){
                result = true;
            }
        }
    }
} 

Wie kann ich ein bool Ergebnis für Name2 erhalten, wenn es @ mit einer Übereinstimmung enthält?

Ich habe versucht, den folgenden Code zu verwenden, weiß jedoch nicht, wie die IT für bestimmte Schlüssel verwendet wird 

result = m.values().stream().anyMatch(v -> v.contains("@"))
4

Sie können einfach m.get("Name2") verwenden, das (nullfähige) Ergebnis in eine Optional einfügen und dann ein Mapping verwenden:

boolean result = Optional.ofNullable(m.get("Name2"))
    .map(l -> l.stream().anyMatch(s -> s.contains("@")))
    .orElse(false);

Dies ist vorzuziehen, wenn Sie den Eintragssatz durchlaufen, da HashMap.get O(1) und das Durchlaufen des Eintragssatzes O (n) ist.

3
Michael

Mach Folgendes:

boolean result = m.getOrDefault("Name2", Collections.emptyList()).stream()
    .anyMatch(i -> i.contains("@"));

Wenn die Variable Map einen korrekten Schlüssel enthält, prüfen Sie, ob eines der Elemente des Parameters List as das bestimmte Zeichen enthält. Wenn die Map den Schlüssel nicht enthält, machen Sie die leere Collection, die überhaupt nichts enthält, und das Ergebnis wird automatisch als false ausgewertet.

Bearbeiten: Wie von @Michael vorgeschlagen, ist die Verwendung der Collections.emptyList() eine bessere Wahl als new ArrayList<>().

7
Nikolas

Wie wäre es mit 

String name = "Name1";
boolean result= m.containsKey(name) && m.get(name).stream().anyMatch(a -> a.contains("@"));
2
YCF_L

Versuche dies:

boolean result = m.entrySet().stream()
    .filter(e -> e.getKey().equals(Name2))
    .map(Map.Entry::getValue)
    .flatMap(List::stream)
    .anyMatch(s -> s.contains("@"));
2
Bohemian

erstellen Sie einen Stream aus entrySet() und geben Sie Ihre Kriterien in anyMatch ein:

result = m.entrySet()
          .stream()
          .anyMatch(v -> Objects.equals("Name2", v.getKey()) && 
               v.getValue().stream().anyMatch(s -> s.contains("@")));

oder mit getOrDefault:

result = m.getOrDefault("Name2", Collections.emptyList())
          .stream()
          .anyMatch(s -> s.contains("@"));
1
Aomine

Fügen Sie einfach die richtige Filterbedingung hinzu:

m.entrySet()
.stream()
.anyMatch(entry-> entry.getKey().equals(Name2) && 
   entry.getValue()
.stream()
.anyMatch(string -> string.contains("@"))
.getValue();
1
Vinay Prajapati

Zuerst sollten Sie nach dem erforderlichen Schlüssel filtern. Anschließend können Sie mit anyMatch feststellen, ob der Wert dieses Schlüssels ein Element mit dem Zeichen '@' enthält:

result = m.entrySet ()
          .stream ()
          .filter (e->e.getKey ().equals (Name2))
          .anyMatch (e->e.getValue ().stream ().anyMatch (s->s.contains ("@")));
1
Eran

Was ist damit 

Map<Integer, String> result = hmap.entrySet() 
                             .stream() 
                             .filter(map -> map.getKey().equals("Name2")) 
                             .collect(Collectors.toMap(map -> map.getKey(), map -> map.getValue()))
                             .orElse(null);

Dies behandelt auch die NoSuchElementException.

0
Vinay Hegde