複数のフィルタを使用してJavaストリームのリストを検索します

Drew13:

私は、Javaオブジェクト(getterとsetterを想定)のリストを持っています:

Record(String name, String part, String value);

私は、リストには、特定の含まれている場合のためのブール値を返す必要がname値と一定part値を。

私はそれが一度に一つのフィルタのために働いてい:

//assume records are added to this list
List<Record> masterList = new ArrayList<Record>();

boolean check = masterList.stream().map(Record::getName).filter(record.getName()::equals).findFirst().isPresent();

しかし、私はエラーを取得するNon-static method cannot be referenced from a static contextにはRecord::getPart、この試みのために:

masterList.stream().map(Record::getName).filter(record.getName()::equals).map(Record::getPart).filter(record.getPart()::equals).findFirst().isPresent();
Ousmane D .:

あなたが実行したときに何をしようとしていることだけで可能すなわちないmap(Record::getName)あなたが持っているStream<String>ことが唯一のレコード名に基づいてされた後、すべての文字列は、レコード名および任意の連鎖メソッド呼び出しがどこにありますか。

代わりに、1つだけを使用しますfilter

boolean check = masterList.stream()
                           .filter(s -> s.getName().equals(record.getName()) &&
                                        s.getPart().equals(record.getPart()))
                           .findFirst().isPresent();

以上の使用 anyMatch

boolean check = masterList.stream()
                         .anyMatch(s -> s.getName().equals(record.getName()) &&
                                    s.getPart().equals(record.getPart()));

編集:

それは1人のレコード一致する名前、および他のレコードのマッチング一部にすることができたら?

次のように、あなたはセットにすべてのレコード名やパーツを収集することができます。

Set<String> container = masterList.stream()
                                  .flatMap(r -> Stream.of(r.getName(), r.getPart()))
                                  .collect(toSet());

その後の操作を行います。

boolean result = container.contains(record.getName()) && 
                 container.contains(record.getPart()) ;

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=181242&siteId=1