Автор вопроса потерялся, придётся предлагать возможные варианты. Начну с самого простого - группировки в Map соответствующим коллектором:
Map<String, Integer> map = list.stream()
.collect(Collectors.toMap(Animal::getType,
Animal::getCount,
(a, b) -> a + b));
Чуть более сложный, хоть и проще выглядящий, но существенно более гибкий вариант - группирующий коллектор:
Map<String, Integer> map = list.stream()
.collect(Collectors.groupingBy(Animal::getType,
Collectors.summingInt(Animal::getCount)));
Ну и совсем низкоуровневый вариант - написание собственного коллектора:
List<Animal> aggregated
= list.stream()
.collect(Collector.of(HashMap<String, Integer>::new,
(acc, val) -> acc.compute(val.getType(), (k, v) -> v == null ? val.getCount() : v + val.getCount()),
(l, r) -> {
l.replaceAll((k, v) -> v + r.getOrDefault(k, 0));
return l;
},
acc -> acc.entrySet()
.stream()
.map(e -> new Animal(e.getKey(), e.getValue()))
.collect(Collectors.toList())));