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