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("@"))
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.
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<>()
.
Wie wäre es mit
String name = "Name1";
boolean result= m.containsKey(name) && m.get(name).stream().anyMatch(a -> a.contains("@"));
Versuche dies:
boolean result = m.entrySet().stream()
.filter(e -> e.getKey().equals(Name2))
.map(Map.Entry::getValue)
.flatMap(List::stream)
.anyMatch(s -> s.contains("@"));
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("@"));
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();
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 ("@")));
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.