Ich habe eine Liste von Objekten mit vielen dupliziert und einige Felder, die zusammengeführt werden müssen. Ich möchte dies auf eine Liste von einzigartigen Objekten reduzieren, die nur Java 8 Streams verwenden (ich weiß, wie man das über Old-Skool macht, aber das ist ein Experiment.)Gruppe und reduzieren Liste der Objekte
Dies ist, was ich gerade habe. Ich nicht wirklich mag, weil die Karte Bildung scheint fremd und die Werte() Sammlung eine Ansicht der Trägerkarte ist, und Sie müssen es in einem neuen ArrayList<>(...)
wickeln eine spezifischere Sammlung zu erhalten. Gibt es einen besseren Ansatz, vielleicht die allgemeineren Reduktionsoperationen?
@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);
}
}
Ist es möglich, diesen "alten Skool" (konventionell, ohne Lambda/Streams) ohne eine Zwischenkarte zu implementieren? Ich denke, da Duplikate möglicherweise irgendwo in der Eingabe vorkommen können, müssen sie irgendwo zwischengespeichert werden, bis alle Eingaben verarbeitet sind. –