当List<A>和List<B>以多个字段进行match,将match成功的List<A>和List<B>分别出力。用java8写一个共通方法
时间: 2024-06-12 21:04:56 浏览: 123
java中常用list方法,jdk8中的一些方法整理
可以使用Java 8的Stream API和lambda表达式来实现这个共通方法。假设List<A>和List<B>都有以下字段:
```java
class A {
private int id;
private String name;
// ...
}
class B {
private int id;
private String description;
// ...
}
```
那么可以定义如下方法来进行匹配:
```java
public static <T, U> Map<T, U> match(List<T> list1, List<U> list2,
BiPredicate<T, U> matcher) {
return list1.stream()
.flatMap(a -> list2.stream()
.filter(b -> matcher.test(a, b))
.map(b -> new AbstractMap.SimpleEntry<>(a, b)))
.collect(Collectors.toMap(
AbstractMap.SimpleEntry::getKey,
AbstractMap.SimpleEntry::getValue));
}
```
其中,BiPredicate是一个函数接口,用于判断两个对象是否匹配。例如:
```java
BiPredicate<A, B> matcher = (a, b) -> a.getId() == b.getId()
&& a.getName().equals(b.getDescription());
```
然后,可以调用match方法来进行匹配:
```java
List<A> list1 = Arrays.asList(new A(1, "foo"), new A(2, "bar"));
List<B> list2 = Arrays.asList(new B(1, "description of foo"),
new B(3, "description of baz"));
Map<A, B> matched = match(list1, list2, matcher);
matched.forEach((a, b) -> System.out.println(a + " -> " + b));
```
输出结果为:
```
A{id=1, name='foo'} -> B{id=1, description='description of foo'}
```
阅读全文