У меня есть этот код, который отлично работает, но я нахожу его уродливым.
@EqualsAndHashCode
public abstract class Actions {
@Getter
private List<ActionsBloc> blocs;
public Actions mergeWith(@NotNull Actions other) {
this.blocs = Stream.of(this.blocs, other.blocs)
.flatMap(Collection::stream)
.collect(groupingBy(ActionsBloc::getClass, reducing(ActionsBloc::mergeWith)))
.values()
.stream()
.filter(Optional::isPresent)
.map(Optional::get)
.collect(toList());
return this;
}
}
ActionsBloc
- это супертип, который содержит список Action
.
public interface ActionsBloc {
<T extends Action> List<T> actions();
default ActionsBloc mergeWith(ActionsBloc ab) {
this.actions().addAll(ab.actions());
return this;
}
}
Что я хочу сделать, это объединить blocs
из Actions
вместе на основе типа Class
. Поэтому я группирую по ActionsBloc::getClass
, а затем объединяюсь, вызывая ActionsBloc::mergeWith
.
То, что я считаю уродливым, вызывает values().stream()
после того, как первый поток закончился collect
.
Есть ли способ работать только на одном потоке и избавиться от values().stream()
, или мне нужно написать собственный Spliterator? Другими словами, в моем коде есть только один collect
.