【发布时间】:2018-02-25 13:45:22
【问题描述】:
我有一个方法可以接受一些函数式接口,当使用 lambda 表达式调用时可以正常工作。
但是,当我尝试从提供内联 lambda 表达式的 main 方法中使用相同的语法时(而不是像第一种情况那样定义它的实例并调用该方法),它给了我一个语法错误。我错过了什么?
这里是代码
package test.lambdas;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
public class Person {
private String givenName;
private String surName;
private int age;
public String getGivenName() {
return givenName;
}
public Person setGivenName(String givenName) {
this.givenName = givenName;
return this;
}
public String getSurName() {
return surName;
}
public Person setSurName(String surName) {
this.surName = surName;
return this;
}
public int getAge() {
return age;
}
public Person setAge(int age) {
this.age = age;
return this;
}
public String getGender() {
return gender;
}
public Person setGender(String gender) {
this.gender = gender;
return this;
}
public String geteMail() {
return eMail;
}
public Person seteMail(String eMail) {
this.eMail = eMail;
return this;
}
public String getPhone() {
return phone;
}
public Person setPhone(String phone) {
this.phone = phone;
return this;
}
public String getAddress() {
return address;
}
public Person setAddress(String address) {
this.address = address;
return this;
}
private String gender;
private String eMail;
private String phone;
private String address;
public String toString(){
return givenName;
}
static void print(List<Person> l, Predicate<Person> p, Function<Person, String> f, Consumer<String> c){
for(Person p1 : l){
if(p.test(p1)){
c.accept(f.apply(p1));
}
}
}
public static List<Person> getPersons(){
List<Person> lp = new ArrayList<>();
Person p = new Person();
p.setGivenName("X").setSurName("Y").setAge(15).seteMail("test@test.com").setGender("Male").setAddress("Test Location");
Person p1 = new Person();
p1.setGivenName("A").setSurName("B").setAge(34).seteMail("test1@test.com").setGender("Male").setAddress("Test Location1");
Person p2 = new Person();
p2.setGivenName("M").setSurName("N").setAge(33).seteMail("test2@test.com").setGender("Male").setAddress("Test Location2");
lp.add(p);lp.add(p1);lp.add(p2);
return lp;
}
public static void main(String[] args) {
List<Person> l = getPersons();
Predicate<Person> p = p1 -> p1.getAge() > 18;
Function<Person, String> f = p2 -> p2.geteMail();
Consumer<String> c = p3 -> System.out.println("Email "+p3+" is a major");
print(l, p, f, c); //this works fine
//lets do it inline
for(Person p1 : l){
c.accept(f.apply(p1 -> p1.getAge() > 18)); //this throws error detailed below
}
}
}
线
c.accept(f.apply(p1 -> p1.getAge() > 18));
抛出以下错误
在 f.apply => 类型 Function 中的方法 apply(Person) 不适用于参数 (( p1) -> {})
-
(at p1 -> p1.getAge() > 18) => 这个表达式的目标类型必须是函数式接口
c.accept() 接受它打印出来的字符串。 f.apply() 接受一个人并返回一个字符串(他的电子邮件),c.accept 打印出来。我知道我向 f.apply() 提供 (p1 -> p1.getAge()> 18) 的尝试是错误的。我的问题是如何重新创建内联静态打印方法,或者不可能这样做?
【问题讨论】: