基本上,我想使用 Predicate
来过滤泛型(扩展 Collection),然后返回相同泛型 Collection 实现的实例(最好是新实例),例如实现方法签名FremoveNulls(Finputs)
。
我有以下示例,但每个示例都有一些警告(removeNulls4
可能是最接近我想要实现的目标):
注意事项
删除Nulls1:
- 返回的列表可能(/将)不是
F
的实例(需要转换)
删除Nulls2:
F
的实现不能有空构造函数- 使用
forReturn
对象is not thread safe (if run in parallel)
删除Nulls3:
- 修改原始列表
- 正在重新发明轮子/不可并行(更喜欢使用
filter
方法) Iterator.remove()
can throw anUnsupportedOperationException
删除Nulls4:
- 修改原始列表
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;
}
}
最佳答案
您可以提供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);
关于Java > 过滤通用集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36441760/