Я думаю, что атрибут счетчика в классе Tag
для подсчета того, как часто Tag
встречается в списке questions
, является ошибкой дизайна. Там такой счетчик не нужен.
Возможный правдоподобный пример: представьте, что у вас есть класс Student
и класс Course
. Чтобы отслеживать, сколько студентов обучается на курсе, счетчик в классе Student
не нужен. Таким же образом класс Tag
должен содержать только атрибуты тега. Тем не менее, вы можете достичь своей цели без счетчика с помощью одного из двух следующих подходов (при условии, что у вас java 8 или выше и ваш класс Tag
переопределяет методы equals
и hashcode
):
Подход 1 с использованием Streams
& Collectors.groupingBy
Map<Tag,Long> map = allQuestions.stream()
.flatMap(q -> q.getTags().stream())
.filter(allTags::contains)
.collect(Collectors.groupingBy(Function.identity(),Collectors.counting()));
Подход 2 с использованием List.forEach
& Map.compute
Map<Tag, Integer> map2 = new HashMap<>();
allQuestions.forEach(q -> {
q.getTags()
.stream()
.filter(allTags::contains)
.forEach(t -> map2.compute(t, (k, v) -> v == null ? 1 : v + 1));
});
Или с использованием традиционных for-loop
и if-else
блок
Map<Tag, Integer> map3 = new HashMap<>();
for (Question q : allQuestions) {
for (Tag t : q.getTags()) {
if (allTags.contains(t)) {
if (map3.containsKey(t)) {
map3.put(t, map3.get(t) + 1);
} else {
map3.put(t, 1);
}
}
}
}