gpt4 book ai didi

java - 在 Java 中使用内联 lambda 表达式时出现编译器错误

转载 作者:行者123 更新时间:2023-11-30 10:18:57 25 4
gpt4 key购买 nike

我有一个接受一些函数式接口(interface)的方法,在使用 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));

抛出以下错误

  1. at f.apply => 类型 Function 中的方法 apply(Person) 不适用于参数 (( p1) -> {})

  2. (at p1 -> p1.getAge() > 18) => 这个表达式的目标类型必须是函数式接口(interface)

    c.accept() 接受它打印出来的字符串。 f.apply() 接受一个 Person 并返回一个字符串(他的电子邮件),c.accept 打印出来。我知道我尝试向 f.apply() 提供 (p1 -> p1.getAge()> 18) 是错误的。我的问题是如何重新创建内联静态打印方法或者不可能这样做?

最佳答案

改变:

c.accept(f.apply(p1 -> p1.getAge() > 18));

到:

c.accept(f.apply(p1));

这是因为函数 f 接受的是 Person 而不是函数。

编辑:

如果你想复制 print 方法内联的内容,那么你可以这样做:

l.stream().filter(p).forEach(p1 -> c.accept(f.apply(p1)));

关于java - 在 Java 中使用内联 lambda 表达式时出现编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48974148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com