我只是想检查一下是否有更好的方法来嵌套嵌套循环。下面是代码:
if(order){
outer: for (Object item : list) {
if (item.detail() == 1) {
for (Object2 item2 : list2) {
if(item2.getOrderNbr() == item.getOrderNbr()) {
//non-related
break outer;
}
}
}
}
有关我要做什么的摘要。我有两个列表,第一个列表包含类似对象的列表,但是有一个额外的字段,可以告诉我订单是否在某个特定位置。如果是,则转到第二个列表,并尝试根据订单号在该列表中找到相应的对象,因为订单号将匹配。第二个列表没有属性来告诉我它是否在某个位置上,因此我必须同时使用两个列表。
答案 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
中位于同一地点的多个订单。