Java > 过滤通用集合

标签 java generics

基本上,我想使用 Predicate 来过滤泛型(扩展 Collection),然后返回相同泛型 Collection 实现的实例(最好是新实例),例如实现方法签名FremoveNulls(Finputs)

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

注意事项

删除Nulls1:

  • 返回的列表可能(/将)不是 F 的实例(需要转换)

删除Nulls2:

删除Nulls3:

删除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/

相关文章:

java - 更新小部件和 Activity 的数据

java - spring Autowiring 依赖项注入(inject)失败

vb.net - 如何使用表单中的属性网格来编辑任何类型

java - 将 h2 数据库实现到现有的 spring-boot 应用程序

java - 如何在 Java 中使用泛型转换列表?

java - Quartz 2.2.3 JobStore 属性被默认设置覆盖 - Spring Boot、Liquibase、Oracle

swift - 在 Swift 中存储 Enum 类型

java - 类定义类名<>

java - 实例化泛型 : new ArrayList<? >() 与 new ArrayList<List<?>>()

c# - 构建通用过滤器参数输入接口(interface)?