嵌套循环的更好方法

时间:2019-12-23 22:04:47

标签: java

我只是想检查一下是否有更好的方法来嵌套嵌套循环。下面是代码:

   if(order){
        outer: for (Object item : list) {
            if (item.detail() == 1) {
                for (Object2 item2 : list2) {
                    if(item2.getOrderNbr() == item.getOrderNbr()) {
                        //non-related
                        break outer;
                    }
            }
        }
    }

有关我要做什么的摘要。我有两个列表,第一个列表包含类似对象的列表,但是有一个额外的字段,可以告诉我订单是否在某个特定位置。如果是,则转到第二个列表,并尝试根据订单号在该列表中找到相应的对象,因为订单号将匹配。第二个列表没有属性来告诉我它是否在某个位置上,因此我必须同时使用两个列表。

2 个答案:

答案 0 :(得分:0)

此信息流可能会帮助您:

list.stream()
    .filter(item -> item.detail() == 1)
    .anyMatch(item1 -> list2.stream()
                            .anyMatch(item2 -> item1.getOrderNbr() == item2.getOrderNbr()));

两次使用Stream::anyMatch可确保您符合提出的条件。您可以根据返回的boolean执行操作。

如果您想退回该物品,请使用另一种方法使用Stream::filter,它不是终端操作,就像上面的操作一样,它允许Stream继续。 Stream::findAny重新运行合格实例的Optional。请记住,如果getOrderNbr等于更多项目,则过滤可能会返回多个实例:

list.stream()
    .filter(item -> item.detail() == 1)
    .filter(item1 -> list2.stream.anyMatch(item2 -> item1.getOrderNbr() == item2.getOrderNbr()))
    .findFirst();

答案 1 :(得分:0)

由于您一直基于secondList检查orderNbr,因此最好创建一个Map并将其用于更快的检索。

为了便于理解,我假设您的第二个列表包含名为Order的类

您可以尝试以下方法:

Map<Integer, Order> orderMap = new HashMap<>();
list2.stream().collect(Collectors.groupingBy(Order::getOrderNbr));

list1
    .stream()
    .filter(f -> f.getDetail() == 1)
    .map(First::getOrderNbr)
    .forEach(orderNo -> {
        Order order = orderMap.get(orderNo);
        // your-code
    });

注意:该代码还支持list1中位于同一地点的多个订单。

相关问题