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

ken*_*ken 0 java lambda netbeans 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));

    }

}
Run Code Online (Sandbox Code Playgroud)

Uni*_*ron 6

您的方法签名是:

private static void printNames(List<Person> persons, Predicate predicate)
Run Code Online (Sandbox Code Playgroud)

因此,Predicate当你传入时,预计会有Predicate<Person>.你可以通过传入a Predicate<Object>然后强制转换来解决这个问题,这不是最好的:

printNames(.., p -> ((Person) p).getAge() < 18);
Run Code Online (Sandbox Code Playgroud)

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

private static void printNames(List<Person> persons, Predicate<Person> predicate)
Run Code Online (Sandbox Code Playgroud)

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

.map((Person p) -> p.getName())
Run Code Online (Sandbox Code Playgroud)

至:

.map(Person::getName)
Run Code Online (Sandbox Code Playgroud)


Era*_*ran 5

我建议你改变你的方法的签名:

private static void printNames(List<Person> persons, Predicate predicate)
Run Code Online (Sandbox Code Playgroud)

private static void printNames(List<Person> persons, Predicate<Person> predicate)
Run Code Online (Sandbox Code Playgroud)

Stream<Person>在该方法中创建的内容需要使用Predicate<Person>filter方法.