如何解决我的代码中的“非功能性接口”问题

时间:2019-10-29 05:21:34

标签: java predicate functional-interface

我正在学习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不是功能接口

请问我在做什么错?

3 个答案:

答案 0 :(得分:2)

如果您的目的是测试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表达式的意义所在,不是吗...)

答案 1 :(得分:2)

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

CheckIfHopper是一个类,而不是功能接口,应改用CheckTrait。

答案 2 :(得分:0)

如果您要使用谓词探索lambda,请在streams api中研究过滤器。 例如,您可以像下面的代码一样编写代码,而不用编写上面的打印功能。

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

您还可以检查以下链接:https://www.journaldev.com/17072/java-predicate