У меня есть список объектов со многими дублирующимися и некоторыми полями, которые необходимо объединить. Я хочу свести это к списку уникальных объектов, используя только потоки Java 8 (я знаю, как это сделать с помощью old-skool, но это эксперимент.)
Это то, что я имею прямо сейчас. Мне это не очень нравится, потому что построение карт кажется посторонним, а коллекция values () - это представление карты поддержки, и вам нужно обернуть ее в новый ArrayList<>(...)
, чтобы получить более конкретную коллекцию. Есть ли лучший подход, возможно, используя более общие операции сокращения?
@Test
public void reduce() {
Collection<Foo> foos = Stream.of("foo", "bar", "baz")
.flatMap(this::getfoos)
.collect(Collectors.toMap(f -> f.name, f -> f, (l, r) -> {
l.ids.addAll(r.ids);
return l;
})).values();
assertEquals(3, foos.size());
foos.forEach(f -> assertEquals(10, f.ids.size()));
}
private Stream<Foo> getfoos(String n) {
return IntStream.range(0,10).mapToObj(i -> new Foo(n, i));
}
public static class Foo {
private String name;
private List<Integer> ids = new ArrayList<>();
public Foo(String n, int i) {
name = n;
ids.add(i);
}
}