Java 8 Stream API如何重用自定义方法

tar*_*aki 2 java java-8 java-stream

我有一个方法,如:

private List<Person> findFilteredPersons(List<Person> persons,
            Predicate<Person> filter) {
        return persons
                .stream()
                .filter(filter)
                .sorted(BY_NAME.thenComparing(BY_AGE))
                .collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

现在我想在几个地方使用这个方法,但在一个地方我不需要过滤列表,我只想对它进行排序.实现这一目标的最佳方法是什么?

Reu*_*ani 5

要获取所有项目(几乎忽略过滤器),传递一个占用所有人的谓词:

p -> true
Run Code Online (Sandbox Code Playgroud)

您可以创建另一种方法:

private List<Person> findPeople(List<Person> persons) {
    return findFilteredPersons(persons, p -> true);
}
Run Code Online (Sandbox Code Playgroud)


Hol*_*ger 5

简单地使用x -> true谓词来表示"无过滤" 时,你不太可能遇到性能问题,但是,如果你想明确表达未经过滤的操作,那么解决方案是直截了当的:对于这种类型的代码一如既往组织,将操作分为不同的部分和共同的部分:

private List<Person> findFilteredPersons(List<Person> persons, Predicate<Person> filter) {
    return collectSortedPersons(persons.stream().filter(filter));
}
private List<Person> findPersons(List<Person> persons) {
    return collectSortedPersons(persons.stream());
}
private List<Person> collectSortedPersons(Stream<Person> persons) {
    return persons
            .sorted(BY_NAME.thenComparing(BY_AGE))
            .collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)