如何在java中搜索泛型集合对象

时间:2017-09-28 06:11:49

标签: java collections

我正在研究java,目前正在尝试搜索特定DummyUserList类型的对象列表。

public class DummyUserList implements Serializable {

        String firstName;
        String lastName;
        String city;
        ----
        ----

        setter andd getter will go here.
    }

 public static void main(String[] args) {

        List<DummyUserList> searchListObj = new ArrayList<DummyUserList>();

        searchListObj.add(dummyUserList1);
        searchListObj.add(dummyUserList2);
        searchListObj.add(dummyUserList3);

        String toBeSearched = "Singhaniya";

        List<DummyUserList> result = searchListObj.stream()
            .filter(a -> Objects.equals(a.lastName, toBeSearched))
            .collect(Collectors.toList());

        System.out.println("result--->" + result);

    }

目前,上述代码正在DummyUserList的基础上搜索lastName对象。它运行正常,但是如何将通用集合对象传递给filter方法进行搜索?

我正在尝试以下方式:我正在传递一个通用的集合对象,它应该是搜索并返回搜索对象的列表,但我收到一个语法错误,说“ searchText 无法解决或不是字段“。我想做类似下面的代码。

public static <T> List<T> search(Collection<T> collectionObject,
            String searchProperty, String searchText) {     

        List<T> result = collectionObject.stream()
            .filter(a -> Objects.equals(((List<T>) collectionObject).searchText))
            .collect(Collectors.toList());

    }

如何将泛型集合传递给上述搜索方法?是否可以搜索动态集合对象?

1 个答案:

答案 0 :(得分:6)

如果您搜索Collection<T>,则该集合的每个元素都是T类型。不属于List<T>类型。所以你的演员阵容没有意义。

Objects.equals()有两个参数,而不是一个。

并且您不能仅将属性的名称作为String传递(您需要反射来访问该字段)。相反,您需要一种方法将每个T对象转换为String类型的一个属性,以便将此属性与搜索文本进行比较。所以你需要一个Function<T, String>

public static <T> List<T> search(Collection<T> collectionObject,
        Function<T, String> searchPropertyAccessor, String searchText) {     

    List<T> result = collectionObject.stream()
        .filter(item -> Objects.equals(searchPropertyAccessor.apply(item), searchText))
        .collect(Collectors.toList());
}

你会这样称呼它:

List<User> foundUsers = search(users, User::getLastName, "Doe");

请注意,我选择将DummyUserList类重命名为User,因为此类表示的是用户,而不是用户列表。另请注意,我使用getter访问其姓氏,因为公共字段通常是一个坏主意,并且阻止使用方法引用,这非常方便和富有表现力。