Учитывая следующий пример, я хотел бы функцию потока, которая сортирует список, а также вложенный списокJava 8 Streams - Сортировка вложенных списков иерархически
class Foo {
public int sort;
public List<Bar> bars;
public Foo(int sort) {
this.sort = sort;
}
}
class Bar {
public int sort;
public Bar(int sort) {
this.sort = sort;
}
}
@Test
public void testSortering() {
Foo foo = new Foo(1);
Foo foo2 = new Foo(2);
Bar bar = new Bar(1);
Bar bar2 = new Bar(2);
foo.bars = Arrays.asList(bar2, bar);
foo2.bars = Arrays.asList(bar2, bar);
List<Foo> foos = Arrays.asList(foo2, foo);
//I would like to iterate foos and return a new foos sorted, and with bars sorted, so that this goes green
assertEquals(1, foos.get(0).sort);
assertEquals(1, foos.get(0).bars.get(0).sort);
assertEquals(2, foos.get(0).bars.get(1).sort);
assertEquals(2, foos.get(1).sort);
assertEquals(1, foos.get(1).bars.get(0).sort);
assertEquals(2, foos.get(1).bars.get(1).sort);
}
Я попытался это:
List<List<Bar>> foosSorted = foos.stream()
.sorted((o1, o2) -> Integer.compare(o1.sort, o2.sort))
.map(f -> f.bars.stream().sorted((o1, o2) -> Integer.compare(o1.sort, o2.sort)).collect(Collectors.toList()))
.collect(Collectors.toList());
но это возвращает Bar, в то время как я хочу список Foo
Вы хотите, чтобы изменить существующие 'объекты Foo' (который не был бы очень функциональный ...) или создать новый' Foo' объекты с отсортированный список объектов «Бар»? –
Вы должны сначала подумать о том, что вы на самом деле хотите сделать. Отсортируйте список, содержащийся в 'Foo.bars', или создайте новые экземпляры' Foo'. В первом случае просто вызовите 'List.sort' в этих списках. В последнем случае вам нужно построить новые экземпляры 'Foo' в вашей операции' map'. – Holger
Я бы хотел новый список с отсортированными foos и отсортированными барами –