有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用lambda/java8迭代递归列表

我正在寻找帮助,我试图迭代具有订单listOrderItem)的产品,该订单也包含sub-OrderListOrderItem),并且该产品内部也包含结构(n次)
如何递归迭代所有订单,并搜索已完成的操作,并将所有已完成的订单添加到列表中

我已经完成了BFS/DFS,但正在寻找使用java函数编程的最佳优化解决方案。蒂亚

主要产品

Class ProductOrder
{    
  private List<OrderItem> orderItem = new ArrayList<OrderItem>();    
}

产品中的子项

里面也有n个子项

Class OrderItem{
    private String id;

    private String state;

    private Integer quantity;

    private List<OrderItem> orderItem = new ArrayList<OrderItem>();

}

共 (1) 个答案

  1. # 1 楼答案

    通过将以下方法添加到OrderItem,可以使用Stream API解决问题:

    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);
    }