web-dev-qa-db-ja.com

特定のキーの値が存在する場合はリストのマップをチェックしてくださいJava 8

Java 7で

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("abc@*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;
            }
        }
    }
} 

一致するName2が含まれている場合、@のブール結果を取得するにはどうすればよいですか?

次のコードを使用してみましたが、特定のキーにITを使用する方法がわかりません

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

単純にm.get("Name2")を使用し、(null可能)結果をOptionalに配置してから、マッピングを使用できます。

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

HashMap.getはO(1))であり、エントリセットの繰り返し処理はO(n)であるため、これはエントリセットのループ処理よりも望ましい方法です。

6
Michael

以下をせよ:

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

Mapに正しいキーが含まれている場合は、値としてのListの要素に特定の文字が含まれているかどうかを確認します。 Mapにキーが含まれていない場合は、何も含まれていない空のCollectionをモックすると、結果は自動的にfalseとして評価されます。

編集:@Michaelが示唆したように、Collections.emptyList()よりも new ArrayList<>() を使用することをお勧めします。

7
Nikolas

どうですか

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

これを試して:

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

entrySet()からストリームを作成し、anyMatchに基準を指定します。

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

またはgetOrDefaultを使用:

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

正しいフィルター条件を追加するだけです:

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

最初に、必要なキーでフィルタリングする必要があります。次に、anyMatchを使用して、そのキーの値に「@」文字のある要素が含まれているかどうかを判断できます。

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

これはどうですか

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

これは、NoSuchElementExceptionも処理します。

0
Vinay Hegde