【问题标题】:lambda, netbeans, Error: incompatible Types errorlambda,netbeans,错误:不兼容的类型错误
【发布时间】:2025-12-21 14:25:06
【问题描述】:

我正在检查一些简单的 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));

    }

}

【问题讨论】:

  • 不相关,但“person”的复数形式是“people”,因此“peoples”不是最好使用的字段名称。

标签: java netbeans lambda java-8


【解决方案1】:

你的方法签名是:

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

因此,当您传入Predicate&lt;Person&gt; 时,需要Predicate。您可以通过传入 Predicate&lt;Object&gt; 然后进行强制转换来解决此问题,这不是最好的:

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

或者只是更改方法签名来处理Predicate&lt;Person&gt;

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

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

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

到:

.map(Person::getName)

【讨论】:

    【解决方案2】:

    我建议您将方法的签名从:

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

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

    在该方法中创建的 Stream&lt;Person&gt; 需要 Predicate&lt;Person&gt;filter 方法。

    【讨论】:

      最近更新 更多