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

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

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

  1. List<Object1> listOfObject1 = mapper.selectObject1ByName(value1);
  2. List<Object2> listOfObject2 = mapper.selectObject2ByName(value2);
  3. listOfObject1.stream().forEach(object1 -> {
  4. listOfObject2.stream().forEach(object2 -> {
  5. if (object1.getCode() == object2.getCode()) {
  6. //do something
  7. }
  8. });
  9. });

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

avkwfej4

avkwfej41#

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

  1. class MyClass {
  2. static void process(List<Object1> listOfObject1, List<Object2> listOfObject2) {
  3. // set of codes for Object1 instances
  4. Set<Integer> codes = listOfObject1.stream()
  5. .map(Object1::getCode)
  6. .collect(Collectors.toSet());
  7. listOfObject2.stream()
  8. .filter(o2 -> codes.contains(o2.getCode()))
  9. .forEach(MyClass::unarySomething); // method reference
  10. }
  11. static void unarySomething(Object2 o2) {
  12. }
  13. }

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

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

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

  1. Map<Integer, List<Object1>> mapCodes = listOfObject1
  2. .stream()
  3. .collect(Collectors.groupingBy(Object1::getCode));
  4. listOfObject2.stream()
  5. .filter(o2 -> mapCodes.containsKey(o2.getCode()))
  6. .forEach(o2 -> mapCodes.get(o2.getCode())
  7. .forEach(o1 -> binarySomething(o1, o2)));
展开查看全部
am46iovg

am46iovg2#

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

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

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

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

ia2d9nvy3#

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

相关问题