2017-09-28 6 views
1

私は現在、javaに取り組んでおり、現在特定のオブジェクトDummyUserListのリストを検索しようとしています。ジェネリックコレクションオブジェクトをjavaで検索するには

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

一般的な 'List'の型が' DummyUserList'であれば、それを有効にしたいのですが? – n247s

+0

検索方法にreturn文が含まれていない場合は、SOの[mcve](https://stackoverflow.com/help/mcve)をお読みください。 – nullpointer

答えて

5

Collection<T>を検索した場合、コレクションの各要素はTタイプです。タイプList<T>ではありません。あなたのキャストは理にかなっていません。

Objects.equals()は、1つではなく2つの引数をとります。

プロパティの名前を文字列として渡すことはできません(フィールドにアクセスするにはリフレクションが必要です)。代わりに、このプロパティと検索テキストを比較するために、各Tオブジェクトを文字列型のプロパティの1つに変換する方法が必要です。

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

注ませんユーザーリストパブリックフィールドは一般的に悪い考えであり、非常に便利で表現力豊かなメソッド参照の使用を避けるため、私は姓にアクセスするためにゲッターを使用しました。

+0

ありがとう@JBニジェット。あなたは私の日を救う。 – Learner