为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

猛跑小猪 2022-04-28 17:12:35
我有一个 Java 对象列表(假设 getter 和 setter):Record(String name, String part, String value);如果列表包含某个name值和某个值,我需要返回一个布尔part值。我一次只为一个过滤器工作://assume records are added to this listList<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::getPartmasterList.stream().map(Record::getName).filter(record.getName()::equals).map(Record::getPart).filter(record.getPart()::equals).findFirst().isPresent();
查看完整描述

1 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

你试图做的事情是不可能的,即当你执行时,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()) ;


查看完整回答
反对 回复 2022-04-28
  • 1 回答
  • 0 关注
  • 145 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信