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