Я не хочу разбивать поток на два, но я хочу добавить операцию, которая разбивает данные до Я преобразую его.
Чтобы проиллюстрировать это, скажем, у меня есть какой-то общий объект:
public class CommonItem {
private String name;
private boolean isSelected;
/* getters and setters */
}
У меня есть этот объект, представляющий различные вещи, такие как:
public class Foo {
private String text;
private boolean isChecked;
public Foo(String text, boolean isChecked) {
this.text = text;
this.isChecked = isChecked;
}
/* getters and setters */
}
и
public class Bar {
private String title;
private boolean isTicked;
public Bar(String title, boolean isTicked) {
this.title = title;
this.isTicked = isTicked;
}
/* getters and setters */
}
Итак, в операции Stream я могу легко преобразовать их в нужный элемент и разделить их по логическому свойству, выполнив
listOfCommonItems.stream()
.map(item -> new Foo(item.getName(), item.isSelected()))
.collect(Collectors.groupingBy(Foo::isChecked));
.Я хочу вывод - Map<Boolean, List<Foo>>
разделить на два сегмента - те, которые проверены и те, которые нет.Тем не менее, если бы я хотел такого же рода вещи с Bar
, я должен был бы выполнить другие критерии сбора
listOfCommonItems.stream()
.map(item -> new Bar(item.getName(), item.isSelected()))
.collect(Collectors.groupingBy(Bar::isTicked));
, чтобы получить Map<Boolean, List<Bar>>
.
Я могу использовать .filter
, нотогда мне нужно обработать поток дважды.Это похоже на то, если я разделю CommonItem
на две части и обработаю результаты позже.И мне точно не нужны два потока, так как это один и тот же набор данных, мне просто нужно это в двух корзинах, где общие критерии предшествуют их преобразованию.
Однако можно ли как-то выполнить разбиение до сопоставления, так что я могу легко иметь единую логику для разделения, основанную на CommonItem
вместо единицы для конечного преобразованного элемента, а затем собирать на основе этого критерия в конце?