我正在研究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());
}
如何将泛型集合传递给上述搜索方法?是否可以搜索动态集合对象?
答案 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访问其姓氏,因为公共字段通常是一个坏主意,并且阻止使用方法引用,这非常方便和富有表现力。