基本上,我想使用Predicate
来过滤泛型(扩展Collection),然后返回相同通用Collection实现的实例(最好是新实例),例如:实现方法签名F removeNulls(F inputs)
。
我有以下示例,但每个都有警告(removeNulls4
可能最接近我想要达到的目的):
F
的实例(需要转换)F
的实现可能没有空构造函数forReturn
对象is not thread safe (if run in parallel) filter
方法)Iterator.remove()
can throw an UnsupportedOperationException
import java.util.*;
import java.util.function.*;
import java.util.stream.*;
public class QuickTest<I, F extends Collection<I>> {
Predicate<I> removeNullsPredicate = x -> x != null;
@SuppressWarnings("unchecked")
public F removeNulls1(F inputs) throws Exception {
return (F) inputs.stream().filter(removeNullsPredicate)
.collect(Collectors.toList());
}
@SuppressWarnings("unchecked")
public F removeNulls2(F inputs) throws Exception {
F forReturn = (F) inputs.getClass().newInstance();
inputs.stream().filter(removeNullsPredicate)
.collect(Collectors.toCollection(() -> forReturn));
return forReturn;
}
public F removeNulls3(F inputs) throws Exception {
Iterator<I> iter = inputs.iterator();
while (iter.hasNext()){
I next = iter.next();
boolean test = removeNullsPredicate.test(next);
if (!test){
iter.remove();
}
}
return inputs;
}
public F removeNulls4(F inputs) throws Exception {
List<I> forRemoval = inputs.stream().filter(removeNullsPredicate.negate())
.collect(Collectors.toList());
inputs.removeAll(forRemoval);
return inputs;
}
}
答案 0 :(得分:3)
您可以提供Supplier<F>
作为参数:
public F removeNulls(F inputs, Supplier<F> factory) {
return inputs.stream().filter(removeNullsPredicate)
.collect(Collectors.toCollection(factory));
}
然后简单地致电:
List<I> nonNulls = removeNulls(inputs, ArrayList::new);