java嵌套的lambda foreach具有两个不同的列表(其中一个列表必须是final?)

yhuiod9q  于 2021-07-08  发布在  Java
关注(0)|答案(3)|浏览(465)

你能帮我为两个不同的列表编写两个嵌套的foreach循环吗?我需要比较两个列表中存储的特定对象属性?

List<Object1> listOfObject1 = mapper.selectObject1ByName(value1);
List<Object2> listOfObject2 = mapper.selectObject2ByName(value2);

listOfObject1.stream().forEach(object1 -> {
            listOfObject2.stream().forEach(object2 -> {
                if (object1.getCode() == object2.getCode()) {
                    //do something
                }
            });
        });

当然,我得到了这个错误:“lambda表达式中使用的变量应该是final或effective final”,但是我不能使任何列表成为final,因为上面有一些决策逻辑,我用正确的值填充列表,并且在更多的地方写入列表。

avkwfej4

avkwfej41#

如果执行 // do something 零件需要以下任一项 object1 或者 object2 ,则可以将适当的代码收集到一个单独的集合中,稍后用于过滤其他列表中的条目。
例如,如果 object2 必须消耗:

class MyClass {
    static void process(List<Object1> listOfObject1, List<Object2> listOfObject2) {

        // set of codes for Object1 instances
        Set<Integer> codes = listOfObject1.stream()
                                          .map(Object1::getCode)
                                          .collect(Collectors.toSet());
        listOfObject2.stream()
                     .filter(o2 -> codes.contains(o2.getCode()))
                     .forEach(MyClass::unarySomething);  // method reference
    }

    static void unarySomething(Object2 o2) {
    }
}

如果两者都有 object1 以及 object2 使用的方法如下:

static void binarySomething(Object1 o1, Object2 o2) {
}

代码图 Map<Integer, List<Object1>> mapCodes 可以使用 groupingBy 然后申请 filter 以及 forEach :

Map<Integer, List<Object1>> mapCodes = listOfObject1
        .stream()
        .collect(Collectors.groupingBy(Object1::getCode));

listOfObject2.stream()
             .filter(o2 -> mapCodes.containsKey(o2.getCode()))
             .forEach(o2 -> mapCodes.get(o2.getCode())
                                    .forEach(o1 -> binarySomething(o1, o2)));
am46iovg

am46iovg2#

我们可以简单地使用hashmap来保留list2的所有元素,然后我们可以迭代list1的元素并检查它是否存在于hashmap中。

final Map<String,Object> mapOfElements= new HashMap<>();

然后你就可以进行必要的操作了。
list2.foreach(e->mapofements.put(e.getcode(),e));

list1
.stream()
.filter(e->mapOfElements.get(e.getCode())
.collect(Collectors.toList());
ia2d9nvy

ia2d9nvy3#

我认为您可以定义一个比较函数并使用它来比较列表中的数据。我建议使用java Comparator 班级。这样用户就必须定义 compare(T o1, T o2) 以及 equals(Object obj) 功能。

相关问题