如何解决我的代码中的"不是功能接口"问题



我正在学习Java谓词,并在这里学习了基本代码。下面是我的代码。

package TestLambda;
public class Animal {
private String species;
private boolean canHop;
private boolean canSwim;
public Animal(String species,boolean canHop,boolean canSwim){
this.species = species;
this.canHop = canHop;
this.canSwim = canSwim;
}
public boolean canHop(){return canHop;}
public boolean canSwim(){return canSwim;}
public String toString(){return species;}

下面是我的界面。

package TestLambda;
@FunctionalInterface
public interface CheckTrait {
boolean Test(Animal a);
}

实现接口。

package TestLambda;
public class CheckIfHopper implements CheckTrait {
public boolean Test(Animal a){
return a.canHop();
}
}

现在我正在测试一个简单的Lambda。

package TestLambda;
import java.util.ArrayList;
import java.util.List;
public class LambdaSearch {
public static void main(String[] args) {
List<Animal> animals = new ArrayList<>();
animals.add(new Animal("fish",false,true));
animals.add(new Animal("dog",true,true));
animals.add(new Animal("rabbit",true,false));
animals.add(new Animal("horse",true,false));
print(animals, a -> a.canHop());
}
public static void print(List<Animal> animals,CheckIfHopper checkIfHopper){
for(Animal animal :animals){
if(checkIfHopper.Test(animal)){
System.out.println(animal + " ");
}
}
}
}

Mycode抛出错误:-TestLambda.CheckIfHopper不是功能接口

请问我做错了什么?

如果您的目的是测试lambda表达式,那么CheckIfHopper在这里是多余的。

您的print方法将采用CheckTrait参数:

public static void print(List<Animal> animals, CheckTrait checkIfHopper){
for(Animal animal :animals){
if(checkIfHopper.Test(animal)){
System.out.println(animal + " ");
}
}
}

电话是:

print(animals, a -> a.canHop());

或者为了简洁起见,以下内容:

print(animals, Animal::canHop);

不能用lambda表达式来提供类的实例,它的目标类型必须是函数接口(这基本上就是错误消息所说的(

您不需要CheckIfHopper类,因为a -> a.canHop()Animal::canHop提供了CheckTrait的实现,而不需要类声明(这就是lambda表达式的意义所在,不是吗…(

public static void print(List<Animal> animals, CheckIfHopper checkIfHopper);

CheckIfHopper是一个类而不是函数接口,您应该使用CheckTrait。

如果您正在探索带谓词的lambda,请研究streams-api中的filter。例如,您可以像下面这样编写代码,而不是编写上面的打印函数。

animals.stream()
.filter(Animal::canHop)
.foreach(System.out::println);

您也可以查看此链接:https://www.journaldev.com/17072/java-predicate

最新更新