Java写一个共通方法,将StreamA和StreamB按多个key字段进行匹配,并将匹配成功的StreamA和StreamB输出。已知StreamA和StreamB已经提前按后续匹配处理的key字段排好序了,为了提高性能,要求减少嵌套循环
时间: 2024-05-04 12:19:22 浏览: 94
可以使用Java 8提供的Stream API和Lambda表达式来实现这个共通方法。具体实现如下:
```
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class StreamMatch {
public static <T, U> void match(List<T> streamA, List<U> streamB, String[] keys, MatchHandler<T, U> handler) {
Map<List<Object>, List<T>> mapA = streamA.stream()
.collect(Collectors.groupingBy(t -> Stream.of(keys)
.map(key -> getField(t, key))
.collect(Collectors.toList())));
Map<List<Object>, List<U>> mapB = streamB.stream()
.collect(Collectors.groupingBy(u -> Stream.of(keys)
.map(key -> getField(u, key))
.collect(Collectors.toList())));
mapA.forEach((k, v) -> {
List<U> matchB = mapB.get(k);
if (matchB != null) {
v.forEach(t -> matchB.forEach(u -> handler.handle(t, u)));
}
});
}
private static Object getField(Object obj, String fieldName) {
try {
return obj.getClass().getField(fieldName).get(obj);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@FunctionalInterface
public interface MatchHandler<T, U> {
void handle(T t, U u);
}
}
```
这个方法接受两个列表 streamA 和 streamB,以及一个由多个 key 字段组成的字符串数组 keys,以及一个 MatchHandler 函数接口作为参数。方法的作用是,按照 keys 中指定的多个字段进行匹配,将匹配成功的 streamA 和 streamB 的元素,通过 MatchHandler 处理器进行处理输出。
具体实现中,我们首先使用 Stream API 对 streamA 和 streamB 进行分组操作,将它们按照 keys 中指定的多个字段进行分组。然后对于每个分组,我们分别取出 streamA 和 streamB 中的元素,通过 MatchHandler 处理器进行处理输出。
这个方法的时间复杂度为 O(n),因为我们只需要遍历 streamA 和 streamB 一次,不需要嵌套循环,所以性能比较高。
阅读全文