当前位置: 首页 > 知识库问答 >
问题:

Java>筛选泛型集合

袁阿苏
2023-03-14

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

    null
    null
    null
  • 修改原始列表
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;
    }
}

共有1个答案

陈实
2023-03-14

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

public F removeNulls(F inputs, Supplier<F> factory) {
    return inputs.stream().filter(removeNullsPredicate)
            .collect(Collectors.toCollection(factory));
}

然后简单地呼叫:

List<I> nonNulls = removeNulls(inputs, ArrayList::new);
 类似资料:
  • 我想过滤Spark sql。DataFrame只留下想要的数组元素,而不知道整个模式(不要硬编码)。模式: 我希望整个根只包含特定的测量值(已过滤),并且根必须在过滤后至少包含一个。 我有这个根的数据帧,我有一个过滤值的数据帧(一列)。 所以,例如:我只知道我的根包含测量数组,而该数组包含标签。所以我想要包含标签(“label1”、“label2”)的整个根和整个测量值。 最后一次使用爆炸和col

  • 我正在尝试有这样的方法签名:public static List FilterList(List collection,String FilterString,String Property=“”) 这样,我可以从任何地方调用这个方法,并传递给它任何列表,它将返回给我一个过滤的列表。

  • 问题内容: 在解决了之前的问题的基础上,但又导致了另一个问题。如果协议/类类型存储在集合中,则取回并实例化它们会引发错误。下面是一个假设的例子。该范例基于“程序到接口而不是实现”,“程序到接口” 编辑 -我当前的解决方法是遍历集合,但是由于api必须知道各种实现,所以这当然是有限的。另一个限制是这些类型的子类(例如PersianCat,GermanShepherd)将不会调用其重写的函数,否则我将

  • 我有以下问题:我正在学习如何使用MongoDb和C#。可以在集合中插入项,但无法筛选现有集合以检索一个或多个符合查询条件的项。下面是我的类结构: 下面是我保存对象的方法: 并且正确保存了对象,正如您在图像中所看到的: 但是如何检索包含id为1234的对象事务的文档呢? 我使用的是.NET Core2和MongoDb C#驱动程序版本2.5。 编辑:集合是BsonDocument集合,它不是Tran

  • 问题内容: 我有一个代表文本片段的泛型类。该文本片段可能具有多种不同模式(突出显示的不同类型)中的任何一种。这些模式用枚举表示。每个项目的Enum可能不同,但是它必须实现一个接口,该接口提供了一种将其中两个结合的方法(可以突出显示并加粗显示)。所以我有一个界面: 然后我的TextFragment是文本字符串和模式的容器。但是当我尝试声明该类时: 我收到以下错误: 令牌“扩展”的语法错误,预期 根据

  • 问题内容: 如果我有一个通用类: 我想实例化几个项目,例如… …并将它们添加到集合中。如何定义集合,使其可以容纳泛型类型列表?然后,我想在某个时刻迭代集合,并使用Value属性。可能? 问题答案: 让您的泛型类从非泛型基类继承,或实现一个非泛型接口。然后,您可以拥有此类型的集合,并将其转换为用于访问集合内容的任何代码。 这是一个例子。