给出一份人名单:
class Person {
private Integer id;
private Integer age;
private String name;
private Long lat;
private Long lont;
private Boolean hasComputer;
...我想给出一套标准,比如年龄在30到32岁之间,拥有一台电脑的前五名。
我想尝试首先匹配所有的标准,但如果它不起作用,试着匹配其中任何一个。
我有一个类似的方法来做它,如一个完整的文本搜索将与一个排名系统?但我是新的流,所以仍然在寻找解决方案,如何去做。
List<Person> persons = service.getListPersons();
persons.stream().filter(p -> p.getAge.equals(age) && p.hasComputer().equals(true)).allMatch()有什么想法吗?谢谢!
并尝试首先匹配所有的标准,如果不可能,尝试匹配任何:
Persons.steam().allMatch(predicate).limit(5);
Person.steam().anyMatch(predicate).limit(5);发布于 2018-08-16 05:20:45
试试这个,
List<Person> filteredPeople = persons.stream()
.filter(p -> p.getAge() > 30)
.filter(p -> p.getAge() < 32)
.filter(p -> p.getHasComputer())
.limit(5).collect(Collectors.toList());注意,您可以根据需要添加额外的filter谓词。这只是一个模板来完成你的工作。
否则,如果您有一些经过某个外部客户端的动态Predicates数,您仍然可以这样做。
Predicate<Person> ageLowerBoundPredicate = p -> p.getAge() > 30;
Predicate<Person> ageUpperBoundPredicate = p -> p.getAge() < 32;
Predicate<Person> hasComputerPred = p -> p.getHasComputer();
List<Predicate<Person>> predicates = Arrays.asList(ageLowerBoundPredicate, ageUpperBoundPredicate,
hasComputerPred);
List<Person> filteredPeople = persons.stream()
.filter(p -> predicates.stream().allMatch(f -> f.test(p)))
.limit(5).collect(Collectors.toList());https://stackoverflow.com/questions/51869685
复制相似问题