Java 爪哇>;筛选泛型集合

Java 爪哇>;筛选泛型集合,java,generics,Java,Generics,基本上,我希望使用谓词过滤泛型(扩展集合),然后返回同一泛型集合实现的实例(最好是新实例),例如,实现方法签名F removeNulls(F inputs) 我有以下示例,但每个示例都有一些注意事项(removeNulls4可能最接近我想要实现的目标): 警告 移除1: 返回的列表可能(/will)不是F(需要强制转换)的实例 移除2: F的实现可能没有空构造函数 使用forReturn对象 移除3: 修改原始列表 正在重新设计控制盘/不可并行(更倾向于使用过滤器方法) Iterato

基本上,我希望使用
谓词
过滤泛型(扩展集合),然后返回同一泛型集合实现的实例(最好是新实例),例如,实现方法签名
F removeNulls(F inputs)

我有以下示例,但每个示例都有一些注意事项(
removeNulls4
可能最接近我想要实现的目标):

警告 移除1:
  • 返回的列表可能(/will)不是
    F
    (需要强制转换)的实例
移除2:
  • F
    的实现可能没有空构造函数
  • 使用
    forReturn
    对象
移除3:
  • 修改原始列表
  • 正在重新设计控制盘/不可并行(更倾向于使用
    过滤器
    方法)
  • Iterator.remove()
移除4:
  • 修改原始列表
import java.util.*;
导入java.util.function.*;
导入java.util.stream.*;
公共类快速测试{
谓词removeNullsPredicate=x->x!=null;
@抑制警告(“未选中”)
公共F removeNulls1(F输入)引发异常{
return(F)inputs.stream().filter(removeNullsPredicate)
.collect(Collectors.toList());
}
@抑制警告(“未选中”)
公共F removeNulls2(F输入)引发异常{
F forReturn=(F)inputs.getClass().newInstance();
inputs.stream().filter(removeNullsPredicate)
.collect(收集器.toCollection(()->forReturn));
以回报换回报;
}
public F removeNulls3(F输入)引发异常{
迭代器iter=inputs.Iterator();
while(iter.hasNext()){
I next=iter.next();
布尔测试=removeNullsPredicate.test(下一步);
如果(!测试){
iter.remove();
}
}
返回输入;
}
public F removeNulls4(F输入)引发异常{
移除列表=inputs.stream().filter(removeNullsPredicate.negate())
.collect(Collectors.toList());
输入。移除所有(用于移除);
返回输入;
}
}

您可以提供一个
供应商
作为参数:

public F removeNulls(F inputs, Supplier<F> factory) {
    return inputs.stream().filter(removeNullsPredicate)
            .collect(Collectors.toCollection(factory));
}
public F removeNulls(F输入,供应商工厂){
返回inputs.stream().filter(removeNullsPredicate)
.收集(收集器.收集(工厂));
}
然后简单地打电话:

List<I> nonNulls = removeNulls(inputs, ArrayList::new);
List nonNulls=removeNulls(输入,ArrayList::new);

我认为创建集合的新实例是一个实现细节,不应该由通用代码处理。我会考虑扩展集合接口以强制实现提供自定义收集器,或者强制谓词的“用户”通过任何其他方式提供收集器。这是现实中可能的最佳近似+1.