Java中,可以使用 Stream API 来过滤列表中的数据,并同时记录被过滤的数据。可以结合 filter() 方法来筛选符合条件的元素,同时使用 peek() 方法记录过滤的值。本文主要介绍Java中使用Stream()对List<T>或ArrayList<T>集合列表数据,进行过滤(filter)筛选数据并记录过滤的值日志方法代码。

1、使用filter()进行过滤筛选数据

使用 Streamfilter() 方法,可以方便地对 List<T> 进行过滤筛选。在过滤时,可以想要记录被筛选的值。

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

public class Main {

    public static void main(String[] args) {
        // 创建一个 Person 对象的列表
        List<Person> persons = new ArrayList<>();
        persons.add(new Person("John", 25));
        persons.add(new Person("Alice", 30));
        persons.add(new Person("Bob", 35));
        persons.add(new Person("John", 40));
        persons.add(new Person("Charlie", 28));

        // 过滤掉名字为 "John" 的 Person 对象,并打印名字为 "John" 的对象
        List<Person> filtered = persons.stream()
                .filter(p -> {
                    if (!"John".equals(p.getName())) {
                        return true;
                    } else {
                        System.out.println("被过滤的名字: " + p.getName());
                        return false;
                    }
                })
                .collect(Collectors.toList());

        // 输出过滤后的列表
        System.out.println("过滤后的列表: " + filtered);
    }
}
class Person {
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + "}";
    }
}

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

public class Main {

    // 包装器方法:记录被过滤掉的值
    private static <T> Predicate<T> andLogFilteredOutValues(Predicate<T> predicate) {
        return value -> {
            if (predicate.test(value)) {
                return true;
            } else {
                System.out.println("被过滤掉的值: " + value);
                return false;
            }
        };
    }

    public static void main(String[] args) {
        // 创建一个 Person 类对象的列表
        List<Person> persons = Arrays.asList(new Person("John"), new Person("Paul"));

        // 使用流过滤掉名字为 "John" 的 Person 对象,并记录被过滤的对象
        List<Person> filtered = persons.stream()        // 使用包装器
                .filter(andLogFilteredOutValues(p -> !"John".equals(p.getName())))
                .collect(Collectors.toList());

        // 输出过滤后的列表
        System.out.println("过滤后的列表: " + filtered);
    }
}

// Person 类
class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Person{name='" + name + "'}";
    }
}

2、collect()和Collectors.partitioningBy()进行过滤筛选数据

使用Stream结合filter方法进行列表数据的筛选,并使用collectCollectors.partitioningBy进行数据分组和收集操作。

import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.stream.Collectors;

public class Main {

    public static void main(String[] args) {
        // 创建一个 Person 对象的列表
        List<Person> persons = new ArrayList<>();
        persons.add(new Person("John", 25));
        persons.add(new Person("Alice", 30));
        persons.add(new Person("Bob", 35));
        persons.add(new Person("John", 40));
        persons.add(new Person("Charlie", 28));

        // 使用 partitioningBy 将名字为 "John" 的分为一组
        Map<Boolean, List<Person>> map = persons.stream()
                .collect(Collectors.partitioningBy(p -> "John".equals(p.getName())));

        // 打印名字为 "John" 的对象
        System.out.println("filtered (名字为 'John' 的): " + map.get(true));

        // 获取名字不为 "John" 的对象列表
        List<Person> result = map.get(false);

        // 打印名字不为 "John" 的对象列表
        System.out.println("result (名字不为 'John' 的): " + result);
    }
}

class Person {
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + "}";
    }
}

import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.stream.Collectors;

public class Main {

    public static void main(String[] args) {
        // 创建一个 Person 对象的列表
        List<Person> persons = new ArrayList<>();
        persons.add(new Person("John", 25));
        persons.add(new Person("Alice", 30));
        persons.add(new Person("Bob", 35));
        persons.add(new Person("John", 40));
        persons.add(new Person("Charlie", 28));

        // 使用 partitioningBy 将列表分成两部分:名字为 "John" 和不是 "John"
        List<Person> result = persons.stream()
            .collect(Collectors.collectingAndThen(
                Collectors.partitioningBy(p -> "John".equals(p.getName())),
                map -> {
                    // 输出名字为 "John" 的部分
                    System.out.println("filtered: " + map.get(true));
                    // 返回名字不是 "John" 的部分
                    return map.get(false);
                }
            ));

        // 输出过滤后的列表
        System.out.println("过滤后的列表: " + result);
    }
}


class Person {
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + "}";
    }
}

推荐文档