Вы можете решить свою проблему, используя Stream API , добавив следующий метод к OrderItem
:
public Stream<OrderItem> allItems() {
return Stream.concat(Stream.of(this), orderItem.stream().flatMap(OrderItem::allItems));
}
Вы также можете решить эту проблему общим способом:
public static <E> Stream<E> recursiveStream(
E input,
Function<? super E, ? extends Stream<? extends E>> mapper
) {
return Stream.concat(
Stream.of(input),
mapper.apply(input).flatMap(item -> recursiveStream(item, mapper))
);
}
public static <E> Stream<E> recursiveCollection(
E input,
Function<? super E, ? extends Collection<? extends E>> mapper
) {
return recursiveStream(input, mapper.andThen(Collection::stream));
}
Если это решение недостаточно быстрое, создайте метод forEach
, он будет работать немного быстрее, но его труднее использовать, поскольку после него невозможно выполнить конвейерные операции:
public void forEach(Consumer<OrderItem> consumer) {
consumer.accept(this);
for (OrderItem item : orderItem) item.forEach(consumer);
}