Как увеличить счетчик в потоке Java 8 - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть Map и List, которые выглядят как

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");

Каждый раз, когда я нахожу ключ из списка в Map, я хочу увеличить мой итог на величину приращения;

states.stream()
            .filter(s -> hashMap.containsKey(s) && hashMap.get(s))
            .forEach((s) -> {total = total + incr;} );

1 Ответ

0 голосов
/ 06 ноября 2018

Ваша переменная total должна быть конечной (то есть: переносить ключевое слово final) или быть фактически конечной (то есть: вы назначаете ей значение только один раз за пределами лямбды). В противном случае вы не можете использовать эту переменную в своем лямбда-выражении. Вы можете исправить это так,

int total = states.stream()
    .filter(s -> hashMap.containsKey(s) && hashMap.get(s))
    .mapToInt(k -> incr).sum();

Как упомянуто в комментарии ниже, это может быть еще более упрощено как,

int total = states.stream()
    .filter(s -> hashMap.getOrDefault(s, false))
    .mapToInt(k -> incr).sum();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...