Java Stream过滤属性

在Java程序开发中,我们经常需要对一个集合进行过滤操作,筛选出符合条件的元素。Java 8引入的Stream API为我们提供了一种更简洁、优雅的方式来处理集合数据。通过Stream API,我们可以轻松地对集合进行过滤、映射、排序等操作。

本文将重点介绍如何使用Java Stream来过滤集合中的属性,并给出相应的代码示例。

Stream简介

Stream是Java 8引入的一个新的API,它提供了一种高效且易于理解的处理集合数据的方式。通过Stream API,我们可以将集合转化为一个流,然后对该流进行各种操作,最后得到我们需要的结果。

Stream API有两种操作:Intermediate(中间操作)和Terminal(终结操作)。中间操作用于对流进行处理,例如过滤、映射、排序等;终结操作用于触发流的处理,并返回最终结果。

过滤属性

有时候,我们需要对集合中的对象的某个属性进行过滤,只保留满足条件的对象。例如,我们有一个包含员工信息的列表,我们想要筛选出年龄大于30岁的员工。这时,我们可以使用Stream API来实现这个功能。

下面是一个简单的Employee类的定义:

public class Employee {
    private String name;
    private int age;

    public Employee(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 省略getter和setter方法
}

假设我们有一个包含Employee对象的列表,我们想要筛选出年龄大于30岁的员工,可以使用Stream的filter()方法来实现:

List<Employee> employees = Arrays.asList(
    new Employee("Alice", 25),
    new Employee("Bob", 35),
    new Employee("Cathy", 40)
);

List<Employee> result = employees.stream()
    .filter(e -> e.getAge() > 30)
    .collect(Collectors.toList());

result.forEach(e -> System.out.println(e.getName() + " - " + e.getAge()));

上面的代码首先创建了一个包含Employee对象的列表,然后使用Stream的filter()方法筛选出年龄大于30岁的员工,最后将结果收集到一个新的列表中并打印出来。

示例

下面我们通过一个完整的示例来演示如何使用Stream过滤属性。假设我们有一个包含商品信息的列表,每个商品包含名称和价格两个属性。我们想要筛选出价格低于100的商品。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Product {
    private String name;
    private double price;

    public Product(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }

    public static void main(String[] args) {
        List<Product> products = Arrays.asList(
            new Product("A", 50.0),
            new Product("B", 150.0),
            new Product("C", 80.0)
        );

        List<Product> result = products.stream()
            .filter(p -> p.getPrice() < 100)
            .collect(Collectors.toList());

        result.forEach(p -> System.out.println(p.getName() + " - " + p.getPrice()));
    }
}

上面的代码中,我们首先创建了一个包含Product对象的列表,然后使用Stream的filter()方法筛选出价格低于100的商品,最后将结果收集到一个新的列表中并打印出来。

通过这个示例,我们可以看到使用Stream API来过滤属性非常简洁和易于理解,大大提高了代码的可读性和可维护性。

关系图

下面是一个示意图,表示Employee和Product类的关系:

erDiagram
    Employee {
        String name
        int age
    }

    Product {
        String name
        double price
    }

甘特图

下面是一个示意图,表示Stream过滤属性的流程:

gantt
    title Stream过滤属性
    section 过滤属性
        确定需求: done, 2022-01-01, 2022-