2 つの例を次に示します。両方とも、値のプロパティの一致に基づいてキーを出力します。
private static void printMatchingEntriesUsingALoop(Map<String, Map<String, String>> resMap, String key, String value) {
for (Map.Entry<String, Map<String, String>> entry : resMap.entrySet())
if (value.equals(entry.getValue().get(key)))
System.out.println(entry.getKey());
}
private static void printMatchingEntriesUsingGuava(Map<String, Map<String, String>> resMap, final String key, final String value) {
Predicate<Map<String, String>> keyValueMatch =
new Predicate<Map<String, String>>() {
@Override
public boolean apply(@Nullable Map<String, String> stringStringMap) {
return value.equals(stringStringMap.get(key));
}
};
Maps.EntryTransformer<String, Map<String, String>, Void> printKeys =
new Maps.EntryTransformer<String, Map<String, String>, Void>() {
@Override
public Void transformEntry(@Nullable String s,
@Nullable Map<String, String> stringStringMap) {
System.out.println(s);
return null;
}
};
Maps.transformEntries(Maps.filterValues(resMap, keyValueMatch), printKeys);
}
public static void main(String... args) {
Map<String, Map<String, String>> resMap = new TreeMap<String, Map<String, String>>();
printMatchingEntriesUsingALoop(resMap, "first", "mike");
printMatchingEntriesUsingGuava(resMap, "first", "mike");
}
1 つはループを使用し、もう 1 つは Guava を使用します。
前者の方がパフォーマンスは優れていますが、どちらが理解しやすく維持しやすいかを実際に判断する必要があります。
@missingfaktor からのいくつかの提案。あなた自身の判断を使わなければなりませんが、彼はいくつかの問題をうまく強調しました.
- コードの重複が多い。
- 特例扱い。
- より循環的な複雑さ。
- 最初の 3 つの箇条書きの結果として、エラーの可能性が高くなります。
- コードをたどるのが難しい。
あなたがこのソフトウェアをサポートしなければならない新しい開発者だと想像してください。どちらに直面したいですか?