java stream 两个list对象 获取匹配字段相等的数据
时间: 2024-02-09 11:09:33 浏览: 400
可以使用Java 8的Stream API来实现,具体代码如下:
```java
List<Object> list1 = Arrays.asList(obj1, obj2, obj3);
List<Object> list2 = Arrays.asList(obj1, obj4, obj5);
List<Object> result = list1.stream()
.filter(obj -> list2.stream()
.anyMatch(obj2 -> obj2.getField().equals(obj.getField())))
.collect(Collectors.toList());
```
其中,`obj.getField()`表示获取对象的匹配字段,这里假设匹配字段为`field`。`anyMatch`方法表示在`list2`中查找是否有`field`值与`list1`中的对象匹配,如果有则返回`true`,否则返回`false`。`filter`方法则根据`anyMatch`方法的结果筛选出匹配的对象,并返回一个新的List。
相关问题
java stream 两个list对象 匹配字段是否相等
可以使用Java8的Stream API,将两个List对象转换为流,然后使用filter和anyMatch方法进行匹配。示例代码如下:
```
List<ObjectA> listA = ... ;
List<ObjectB> listB = ... ;
boolean isMatched = listA.stream()
.filter(a -> listB.stream()
.anyMatch(b -> a.getField().equals(b.getField())))
.findFirst()
.isPresent();
```
其中,ObjectA和ObjectB分别代表两个对象,getField()方法表示需要比较的字段。如果isMatched为true,则表示两个List对象有相同的字段。
java用stream判断两个不同对象的集合长度是否相等,对象中对应字段是否相同,并排除已经比较相同的同的数据
可以使用Java 8 Stream API中的一些操作来实现这个功能。下面是一种可能的实现方式:
假设有两个不同的对象类型A和B,它们都有一个字段value表示它们的值。
首先,可以使用filter操作来排除已经比较相同的数据,可以使用一个HashSet来记录已经比较过的对象,以确保不会重复比较。接下来,可以使用mapToInt操作将A和B对象的集合转换为长度的集合,然后使用allMatch操作来判断长度是否相等。最后,可以使用anyMatch操作来判断对应字段是否相同。
示例代码如下:
```
List<A> listA = ... // A对象的集合
List<B> listB = ... // B对象的集合
Set<A> comparedA = new HashSet<>(); // 已经比较过的A对象
Set<B> comparedB = new HashSet<>(); // 已经比较过的B对象
boolean result = listA.stream()
.filter(a -> !comparedA.contains(a)) // 排除已经比较过的A对象
.flatMap(a -> listB.stream()
.filter(b -> !comparedB.contains(b)) // 排除已经比较过的B对象
.mapToInt(b -> a.value == b.value ? 1 : 0)) // 将A和B对象转换为长度的集合
.allMatch(i -> i == 1); // 判断长度是否相等
if (result) {
// 长度相等,对应字段也都相同
} else {
// 长度不相等或对应字段不相同
}
```
在上述代码中,首先定义了两个HashSet来记录已经比较过的对象。然后使用listA.stream()将A对象的集合转换为Stream,使用filter操作排除已经比较过的A对象,然后使用flatMap操作将A对象和B对象的集合合并为一个Stream。接着使用filter操作排除已经比较过的B对象,然后使用mapToInt操作将A和B对象转换为长度的集合,长度为1表示对应字段相同,长度为0表示对应字段不相同。最后使用allMatch操作判断长度是否相等,anyMatch操作判断对应字段是否相同。
阅读全文