如何在lambda函数中访问方法局部变量?

时间:2017-05-18 12:37:00

标签: java lambda

我是Lambda的新手,在下面的代码中如何在lambda方法中访问方法变量(personslist)?

输出代码是整个列表,而不仅仅是一个人:

public class ApplicationL1 {
    public static void main(String... args) {
        List<Person> personslist = new ArrayList<>();

        personslist.add(new Person("A", 10, Gender.Male));
        personslist.add(new Person("B", 16, Gender.Female));
        personslist.add(new Person("C", 18, Gender.Female));
        personslist.add(new Person("D", 31, Gender.Female));
        personslist.add(new Person("E", 12, Gender.Female));
        personslist.add(new Person("F", 9, Gender.Male));
        personslist.add(new Person("G", 40, Gender.Male));

        filterPerson(personslist, 
            personA -> personA.getGender() == Gender.Female && personA.getAge() > 30 && personA.getAge() < 40, 
            personB -> System.out.println(personslist.toString()));
    }

    private static void filterPerson(List<Person> personlist, Predicate<Person> tester, Consumer<Person> filtered) {
        for (Person person : personlist) {
            if (tester.test(person)) {
                filtered.accept(person);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

您没有理由期望personslist.toString()仅打印通过过滤器的Person

如果您希望代码仅打印与过滤器匹配的人员,则不应打印整个列表。只需打印通过过滤器的每个Person

filterPerson(personslist, 
        personA -> personA.getGender() == Gender.Female && personA.getAge() > 30 && personA.getAge() < 40, 
        personB -> System.out.println(personB));

personslist可以被lambda表达式访问,因为它实际上是最终的。