java - 如果所有人的工资总额超过...,如何制作职位列表?

标签 java java-8 java-stream

如何制作人员列表,如果所有人员的工资总额超过 5000(例如),或者如果总工资将小于返回空列表

我尝试使用 java.util.Collection.stream()

public static List<Person> filterPositions (List<Person> persons, Predicate<Person> predicate) {
        return positions.stream().filter(predicate).collect(
                Collectors.collectingAndThen(Collectors.summingInt( ...

但我不知道如何继续这段代码

最佳答案

也许你想得太复杂了……

public static List<Person> filterPositions(
    List<Person> persons, Predicate<Person> predicate) {

    return persons.stream().filter(predicate).mapToInt(Person::getSalary).sum() > 5000?
        persons: Collections.emptyList();
}

如果您想返回过滤列表,您可以使用:

public static List<Person> filterPositions(
    List<Person> persons, Predicate<Person> predicate) {

    return persons.stream().filter(predicate).mapToInt(Person::getSalary).sum() > 5000?
        persons.stream().filter(predicate).collect(Collectors.toList()):
        Collections.emptyList();
}

public static List<Person> filterPositions(
    List<Person> persons, Predicate<Person> predicate) {

    persons = persons.stream().filter(predicate).collect(Collectors.toList());
    return persons.stream().mapToInt(Person::getSalary).sum() > 5000?
        persons: Collections.emptyList();
}

任一变体都有优势,具体取决于条件是否为真。虽然第一变型在不是的情况下省略了收集操作,但是第二变型在是的情况下省略了第二过滤操作。因此,偏好取决于条件为真的可能性。或者过滤器有多贵,或者结果列表预计有多大。

<小时/>

如果允许您修改传入列表,则会出现完全不同的选项:

/** modifies {@code persons} list. */
public static void filterPositions(
    List<Person> persons, Predicate<Person> predicate) {

    persons.removeIf(predicate.negate());
    if(persons.stream().mapToInt(Person::getSalary).sum() <= 5000)
        persons.clear();
}

关于java - 如果所有人的工资总额超过...,如何制作职位列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33017060/

相关文章:

java - 提供两个相同类型的不同实例

java - 通过 Maven/Testng 通过动态自定义 TestNG 文件运行测试

java - 将 Char 读入数组

java - 使用 Lambda API 比较 ArrayList 的多个字段并收集对象

java - Play Framework : parse "CompletionStage" (Java8) response

java - 使用 Stream 避免 NoSuchElementException

java - 有人可以向我解释一下使用stream();的这段代码的构造吗?

java - 使用数据库 MySQL 导出 eclipse java 桌面基础应用程序

java - 在嵌套对象上使用 lambda 和流

java - 使用java 8流在排序数字列表中查找最长的连续数字