用java8写一个将List<B>中多个字段与List<A>进行match,并将match成功的List<B>和List<B>出力的共通方法
时间: 2024-05-05 13:17:28 浏览: 205
多个List的交集
5星 · 资源好评率100%
假设B类有属性a、b、c,A类有属性x、y、z,我们可以先定义一个接口Matchable,用来表示B类和A类之间的匹配方式:
```
interface Matchable<B, A> {
boolean match(B b, A a);
}
```
然后我们可以定义一个工具类MatchUtils,其中包含一个通用的match方法:
```
public class MatchUtils {
public static <B, A> Map<B, List<A>> match(List<B> bList, List<A> aList, Matchable<B, A> matchable) {
Map<B, List<A>> result = new HashMap<>();
for (B b : bList) {
List<A> matched = aList.stream()
.filter(a -> matchable.match(b, a))
.collect(Collectors.toList());
if (!matched.isEmpty()) {
result.put(b, matched);
}
}
return result;
}
}
```
这个方法接受三个参数,分别是B类的列表bList、A类的列表aList,以及Matchable接口的实现类matchable,用来指定B类和A类之间的匹配方式。
最后我们可以定义一个B类的子类BImpl,用来表示具体的B类:
```
class BImpl {
private int a;
private String b;
private double c;
public BImpl(int a, String b, double c) {
this.a = a;
this.b = b;
this.c = c;
}
public int getA() {
return a;
}
public String getB() {
return b;
}
public double getC() {
return c;
}
}
```
然后我们可以定义一个A类的子类AImpl,用来表示具体的A类:
```
class AImpl {
private int x;
private String y;
private double z;
public AImpl(int x, String y, double z) {
this.x = x;
this.y = y;
this.z = z;
}
public int getX() {
return x;
}
public String getY() {
return y;
}
public double getZ() {
return z;
}
}
```
最后我们可以编写一个简单的测试程序:
```
public static void main(String[] args) {
List<BImpl> bList = Arrays.asList(
new BImpl(1, "foo", 1.23),
new BImpl(2, "bar", 4.56),
new BImpl(3, "baz", 7.89)
);
List<AImpl> aList = Arrays.asList(
new AImpl(1, "foo", 1.23),
new AImpl(2, "bar", 4.56),
new AImpl(4, "qux", 9.87)
);
Matchable<BImpl, AImpl> matchable = (b, a) -> b.getA() == a.getX() && b.getC() == a.getZ();
Map<BImpl, List<AImpl>> result = MatchUtils.match(bList, aList, matchable);
result.forEach((b, a) -> System.out.println(b.getA() + "," + b.getB() + "," + b.getC() + " matched with " + a));
}
```
这个测试程序中,我们先定义了一个B类的列表bList和一个A类的列表aList,然后定义了一个Matchable接口的实现类matchable,用来指定B类和A类之间的匹配方式。最后调用MatchUtils.match方法进行匹配,并将匹配结果输出到控制台。
阅读全文