我正在尝试简化我的一个方法,它使用了一些Java 8,但不需要使用它:
public <T, U, R> Collection<R> singleCollectionOf(final Collection<T> collectionA, final Collection<U> collectionB, final Supplier<Collection<R>> supplier, final BiFunction<T, U, R> mapper) {
if (Objects.requireNonNull(collectionA).size() != Objects.requireNonNull(collectionB).size()) {
throw new IllegalArgumentException();
}
Objects.requireNonNull(supplier);
Objects.requireNonNull(mapper);
Iterator<T> iteratorA = collectionA.iterator();
Iterator<U> iteratorB = collectionB.iterator();
Collection<R> returnCollection = supplier.get();
while (iteratorA.hasNext() && iteratorB.hasNext()) {
returnCollection.add(mapper.apply(iteratorA.next(), iteratorB.next()));
}
return returnCollection;
}
现在您在这里看到我需要提供Supplier<Collection<R>>
才能创建生成的集合。
有没有办法捕获,当且仅当collectionA
的集合类型等于collectionB
已使用的集合类型时,并减少提供自定义的需要供货商?
我希望能够像伪代码一样调用它:
singleCollectionOf(ArrayList<T>, ArrayList<U>, BiFunction<T, U, R>);
然后它需要能够提供ArrayList::new
本身作为供应商。
这可能吗?有两种方法可以找出实际对象的类型,而不是引用类型,如果两者都是ArrayList
,但是存储了List
引用?
澄清示例:
List<T> list1 = new ArrayList<>();
List<U> list2 = new ArrayList<>();
singleCollectionOf(list1, list2, ...);