使用多个过滤器的Java Stream搜索列表

时间:2019-01-10 23:30:57

标签: java java-stream

我有一个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();

1 个答案:

答案 0 :(得分:3)

您尝试做的事情是不可能的,即执行map(Record::getName)时您有一个Stream<String>,其中所有字符串都是记录名称,此后的任何链接方法调用仅基于记录名称。

相反,只需使用一个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()));

编辑:

是否可以是一个记录匹配名称,而另一个可以是记录匹配部分?

然后,您可以按以下方式将所有记录名称和部分收集到一个集中:

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