2017-09-28 1 views
1

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); 

    } 

현재 상기 코드 lastName에 기초 DummyUserList 객체를 검색한다. 괜찮 으면 좋겠지 만 검색을 위해 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()); 

    } 

검색을 위해 위의 방법으로 일반 컬렉션을 전달하려면 어떻게해야합니까? 동적 컬렉션 객체를 검색 할 수 있습니까?

+2

위의 코드가 DummyUserList를 검색 할 때 약간 혼란 스럽습니다. * – nullpointer

+0

일을시키기 위해 타입이 DummyUserList 여야한다면 왜 일반 List를 허용하고 싶습니까? – n247s

+0

검색 방법에 return 문이 없으면 SO에서 [mcve] (https://stackoverflow.com/help/mcve)를 읽어야합니다. – nullpointer

답변

5

Collection<T>을 검색하는 경우 컬렉션의 각 요소는 T 유형입니다. List<T>이 아닙니다. 그래서 당신의 캐스트가 말이되지 않습니다.

Objects.equals()은 하나가 아니라 두 개의 인수를 취합니다.

그리고 속성의 이름을 문자열로 전달할 수는 없습니다 (필드에 액세스하려면 리플렉션이 필요합니다). 대신이 속성을 검색 텍스트와 비교하기 위해 각 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()); 
} 

그리고 당신은이 방법을 부를 것이다 : : 그래서 당신은 Function<T, String> 필요, 내가 무엇을이 클래스가 나타내는 것은 사용자이기 때문에, 사용자에 DummyUserList 클래스의 이름을 변경하기로 결정했습니다

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

참고하지 사용자 목록 또한 공개 필드는 일반적으로 나쁜 아이디어이고 메서드 참조를 사용하지 못하도록하기 때문에 필자는성에 액세스하기 위해 getter를 사용했습니다. 이는 매우 편리하고 표현력이 좋습니다.

+0

감사합니다. @JB Nizet. 너는 나의 날을 구한다. – Learner

관련 문제