分组和减少对象列表
我有一个对象列表,其中包含许多重复的对象和一些需要合并的字段。我想将其简化为仅使用Java 8 Streams的唯一对象列表(我知道如何通过old-skool手段做到这一点,但这是一个实验。
这就是我现在所拥有的。我真的不喜欢这样,因为map构建似乎无关紧要,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);
}
}