📜  使用 java 流过滤器查找属性的总和 - Java (1)

📅  最后修改于: 2023-12-03 15:36:29.258000             🧑  作者: Mango

使用 Java 流过滤器查找属性总和

在 Java 中,我们可以使用流来处理集合中的元素。流提供了对集合元素的函数式操作,使得我们能够以一种更简洁、更清晰的方式处理集合。流具有并行处理的特性,能够优化大规模数据集的处理效率。

在本文中,我们将介绍如何使用 Java 流过滤器(Stream Filter)来查找对象集合中一个属性的总和。

准备工作

为了演示这种方式,我们需要提前准备一个包含对象的集合。为了简单起见,我们此处使用一个存放人员信息的 Person 类来作为对象。

public class Person {
	private String name;
	private int age;
	private double salary;
	
	public Person(String name, int age, double salary) {
		this.name = name;
		this.age = age;
		this.salary = salary;
	}
	
	public String getName() {
		return name;
	}
	
	public int getAge() {
		return age;
	}
	
	public double getSalary() {
		return salary;
	}
}

创建一个包含多个 Person 对象的集合:

List<Person> personList = new ArrayList<>();
personList.add(new Person("Tom", 23, 5000.0));
personList.add(new Person("Jerry", 24, 6000.0));
personList.add(new Person("Jack", 25, 7000.0));
personList.add(new Person("Rose", 26, 8000.0));
personList.add(new Person("Lucy", 27, 9000.0));

现在,我们有了一个包含多个 Person 对象的集合(personList)。每个 Person 对象都包含三个属性:name、age 和 salary。

现在,我们可以使用 Java 流过滤器来查找这些对象的 salary 总和了。

使用 Java 流过滤器查找属性总和

在 Java 8 中,我们可以使用 stream.filter() 方法来过滤集合中的元素。它需要传递一个 Predicate 参数,用于过滤集合中的元素,得到一个新的流。

public Stream<T> filter(Predicate<? super T> predicate)

现在,我们来使用 filter() 方法和 Stream 的 reduce() 方法来查找 salary 总和:

double total = personList.stream()
                        .mapToDouble(Person::getSalary)
                        .reduce(0, Double::sum);

在这段代码中:

  • 我们首先使用 stream() 方法得到一个 Stream 对象,然后使用 mapToDouble 方法将每个 Person 对象的 salary 属性映射为 Double 类型的 Stream,得到一个新的 Stream。
  • 接着,我们使用 reduce() 方法,将所有的 salary 属性的值相加得到一个总和。

代码如下:

double total = personList.stream()
                        .mapToDouble(Person::getSalary)
                        .reduce(0, Double::sum);
完整代码

为了更好地理解上述代码,我们来展示一下完整的示例代码:

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Person> personList = new ArrayList<>();
        personList.add(new Person("Tom", 23, 5000.0));
        personList.add(new Person("Jerry", 24, 6000.0));
        personList.add(new Person("Jack", 25, 7000.0));
        personList.add(new Person("Rose", 26, 8000.0));
        personList.add(new Person("Lucy", 27, 9000.0));

        double total = personList.stream()
                                .mapToDouble(Person::getSalary)
                                .reduce(0, Double::sum);
        
        System.out.println("Total salary: " + total);
    }
}

class Person {
    private String name;
    private int age;
    private double salary;

    public Person(String name, int age, double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public double getSalary() {
        return salary;
    }
}
总结

在本文中,我们介绍了如何使用 Java 流过滤器查找对象集合中一个属性的总和。通过使用 Java 8 中引入的流,我们能够以一种更简洁、更清晰的方式处理集合。在大规模数据集的处理中,流还能发挥出并行处理的优势。