user3342812:
Tengo Map
y List
que se parece
int total = 0;
int incr = 10;
Map<String, Boolean> hashMap = new HashMap();
hashMap.put("A", true);
hashMap.put("B", false);
hashMap.put("C", true);
List<String> states = new ArrayList<>();
states.add("A");
states.add("B");
states.add("D");
states.add("E");
states.add("F");
Cada vez que encuentro una clave de la lista en el Map
entonces quiero incrementar mi total en un valor de incremento;
states.stream()
.filter(s -> hashMap.containsKey(s) && hashMap.get(s))
.forEach((s) -> {total = total + incr;} );
Ravindra Ranwala:
La variable total
debe ser final (es decir: llevar la palabra clave final), o sea efectivamente final (es decir: sólo se asigna un valor a la misma una vez fuera de la lambda). De lo contrario, no se puede utilizar esa variable dentro de su expresión lambda. Es posible fijarlo como este,
int total = states.stream()
.filter(s -> hashMap.containsKey(s) && hashMap.get(s))
.mapToInt(k -> incr).sum();
Como se menciona en el siguiente comentario, esto se puede simplificar aún más como,
int total = states.stream()
.filter(s -> hashMap.getOrDefault(s, false))
.mapToInt(k -> incr).sum();