考虑下面这个获取varargs参数的通用静态方法。
public static <T> Predicate<T> distinctBy(Function<? super T, ?>... fieldSelectors)
{
final Map<List<?>, Boolean> seen = new ConcurrentHashMap<>();
return t ->
{
final List<?> keys = Arrays.stream(fieldSelectors)
.map(k -> k.apply(t))
.collect(Collectors.toList());
return seen.putIfAbsent(keys, Boolean.TRUE) == null;
};
}
后期在实现中我让调度员的作业多线程,通过不同的线程来使用这个静态方法,如下图。
List<X> xlist = list1.stream()
.filter(distinctBy(X::funcX1, X::funcX2, X::funcX3))
.collect(Collectors.toList());
List<Y> ylist = list2.stream()
.filter(distinctBy(Y::funcY1, Y::funcY2))
.collect(Collectors.toList());
我也从代码分析中得到一个警告,说有可能因为varargs参数而造成堆污染。是不是因为静态方法里面使用了ConcurrentHashMap?