lambda,netbeans,错误:不兼容的类型错误

时间:2014-11-14 09:51:40

标签: java netbeans lambda java-8

我正在检查一些简单的Lambda表达式,我在互联网上找到了以下示例,该示例应该有效。

不幸的是,似乎NetBeans 8.0.1不喜欢行(Person p) -> p.getAge() < 18).map((Person p) -> p.getName())

中的代码

显示错误“lambda表达式中不兼容的参数类型”

任何人都有一个想法如何解决问题?

public class Lambda {

    private enum Gender {

        MALE, FEMALE
    };

    public static class Person {

        private final String name;
        private final int age;
        private final Gender gender;

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

        public String getName() {
            return name;
        }


        public int getAge() {
            return age;
        }

        public Gender getGender() {
            return gender;
        }

    }

    public static void main(String[] args) {

        List<Person> persons = new ArrayList<>();
        persons.add(new Person("angelo", 50, Lambda.Gender.MALE));
        persons.add(new Person("paolo", 10, Lambda.Gender.MALE));
        persons.add(new Person("giuseppe", 5, Lambda.Gender.MALE));
        persons.add(new Person("andrea", 22, Lambda.Gender.FEMALE));
        persons.add(new Person("guglielmo", 2, Lambda.Gender.FEMALE));

        printNames(persons, 
                (Person p) -> p.getAge() < 18);

    }

    private static void printNames(List<Person> persons, Predicate predicate) {

        persons.stream()
                .filter(predicate)
                .map((Person p) -> p.getName())
                .sorted()
                .forEach(name -> System.out.println(name));

    }

}

2 个答案:

答案 0 :(得分:6)

您的方法签名是:

private static void printNames(List<Person> persons, Predicate predicate)

因此,当您在Predicate传递时,预计会Predicate<Person>。您可以通过传入Predicate<Object>然后投射来解决这个问题,这不是最好的:

printNames(.., p -> ((Person) p).getAge() < 18);

或者只需更改方法签名即可处理Predicate<Person>

private static void printNames(List<Person> persons, Predicate<Person> predicate)

作为旁注,您可以在代码中替换:

.map((Person p) -> p.getName())

为:

.map(Person::getName)

答案 1 :(得分:5)

我建议您更改方法的签名:

private static void printNames(List<Person> persons, Predicate predicate)

private static void printNames(List<Person> persons, Predicate<Person> predicate)

在该方法中创建的Stream<Person>期望Predicate<Person>方法filter