java - 调试 Java 8 过滤器

标签 java debugging predicate verbose

我有员工对象

public class Employee {

    public Employee(Integer id, Integer age, String gender, String fName, String lName) {
        this.id = id;
        this.age = age;
        this.gender = gender;
        this.firstName = fName;
        this.lastName = lName;
    }

    private Integer id;
    private Integer age;
    private String gender;
    private String firstName;
    private String lastName;

我有两个谓词

public static Predicate<Employee> firstNameLike(final String name) {
        return p -> p.getFirstName().contains(name);
    }


    public static Predicate<Employee> isAdultFemale() {
        return p -> p.getAge() > 18 && p.getGender().equalsIgnoreCase("F");
    }

我正在对员工应用多个过滤器,例如

public static void main(String[] args) {

        Employee e2 = new Employee(2, 13, "F", "Martina", "Hengis");
        Employee e5 = new Employee(5, 19, "F", "Cristine", "Maria");
        Employee e7 = new Employee(7, 68, "F", "Melissa", "Roy");
        Employee e9 = new Employee(9, 15, "F", "Neetu", "Singh");


        Employee e1 = new Employee(1, 23, "M", "Rick", "Beethovan");
        Employee e3 = new Employee(3, 43, "M", "Ricky", "Martin");
        Employee e4 = new Employee(4, 26, "M", "Jon", "Lowman");
        Employee e6 = new Employee(6, 15, "M", "David", "Feezor");
        Employee e8 = new Employee(8, 79, "M", "Alex", "Gussin");
        Employee e10 = new Employee(10, 45, "M", "Naveen", "Jain");


        List<Employee> employees = new ArrayList<Employee>();
        employees.addAll(Arrays.asList(new Employee[]{e1, e2, e3, e4, e5, e6, e7, e8, e9, e10}));


        List<Predicate<Employee>> predicates = new ArrayList<>();

        predicates.add(EmployeePredicates.isAdultFemale());
        predicates.add(EmployeePredicates.firstNameLike("J"));


        final Predicate<Employee> employeePredicate = predicates.stream().reduce(Predicate::or).get();


        final List<Employee> collect = employees.stream().filter(employeePredicate).collect(Collectors.toList());

这一切都工作得很好,但是我想要做的是为每个员工应用过滤器并打印。可以说

employee1 被过滤掉,因为它不是女性等。这可能吗?

最佳答案

您可以将调试打印添加到谓词:

public static Predicate<Employee> firstNameLike(final String name) {
    return p -> {
        boolean passed = p.getFirstName().contains(name);
        if (!passed) {
            System.out.println(p.getFirstName() + " doesn't contain " + name);
        }
        return passed;
    }
}


public static Predicate<Employee> isAdultFemale() {
    return p -> {
        booolean passed = p.getAge() > 18 && p.getGender().equalsIgnoreCase("F");
        if (!passed) {
            System.out.println("employee not an adult female");
        }
        return passed;
    }
}

关于java - 调试 Java 8 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46094350/

相关文章:

objective-c - 调试时如何从 block 中访问 self 或 ivars

filter - Java Stream 过滤器匹配多个条件谓词

lambda - 在 prolog 中的谓词内定义谓词

ada - 如何处理 Ada 动态谓词中未初始化的数据?

java - 即使我有预期的注释,JUnit 测试在 eclipse 中运行也会返回错误

java - eclipse 要求我在 finally block 中用 try/catch 包围 - 可以禁用它吗?

java - Mongodb Java 驱动程序不断记录消息,如何禁用它?

java - 在 Spring Data Mongodb Reactive 中执行顺序查询

c - 当 switch 语句中有两个连续的 break 时会发生什么?

c - 如何让 Mac OS X CrashReporter 调用调试器?