Ecco due esempi. Entrambi stampano la chiave in base alla corrispondenza nelle proprietà del valore.
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");
}
Uno utilizza un loop e uno usa Guava.
Mentre il primo si comporta meglio, è necessario decidere quale sarà il più facile da capire e mantenere.
Alcuni suggerimenti da @missingfaktor. Devi usare il tuo giudizio, ma ha evidenziato bene alcuni dei problemi.
- un sacco di duplicazione del codice.
- gestione di casi speciali.
- Più complessità ciclomatica.
- Più possibilità di errore, a seguito dei primi tre proiettili.
- Difficile da seguire codice.
Immagina di essere un nuovo sviluppatore che deve supportare questo software. Quale preferiresti essere di fronte?
è necessario un qualche tipo di LINQ equivalente di DotNet in Java ... – Wins
Perché si vuole evitare un ciclo? Qualunque cosa tu usi è come usare un loop per te. –
Commento secondario: cambia l'ordine negli uguali, poiché get ("mike") potrebbe restituire null. cioè 'if (" jordan ".equals (el.getValue(). get (" mike "))' – user949300