当前位置: 首页 > 知识库问答 >
问题:

为什么实例方法的Java方法引用不能赋给消费者接口

逄俊力
2023-03-14

这是我的代码:

public class SearchByLambda {

     private Map<String,Consumer<Person>> searchCritertiaHolder = new HashMap<String,Consumer<Person>>();

     private static final String AGED = "aged";

     public SearchByLambda(){
           searchCritertiaHolder.put(AGED, (Person p)-> {p.filterAgedPerson(p);} );
     }

     private Consumer<Person> getFilter(String personType){
          return searchCritertiaHolder.get(personType);
     }

     public static void main(String[] args) {
          SearchByLambda searchUsage = new SearchByLambda();
          Person p = new Person(59,"shailesh");
          Person p1 = new Person(58,"ganesh");

          searchUsage.getFilter(AGED).accept(p);
          searchUsage.getFilter(AGED).accept(p1);

          Person.printAgedPersons();
     }
 }

 class Person{

       private static List<Person> agedPersons = new ArrayList<>();

       private int age;

       private String name;

       public int getAge() {
              return age;
       }

       public void setAge(int age) {
          this.age = age;
       }

       public String getName() {
            return name;
       }

       public void setName(String name) {
            this.name = name;
       }

       public Person(int age,String name){
           this.age = age;
           this.name = name;
       }

       public void filterAgedPerson(Person person){
          if(person.getAge() > 58){
              agedPersons.add(person);
          }
       }

       public static void printAgedPersons(){
            for(Person person : agedPersons){
                System.out.println(person.getName());
            }
       }
 }

当我替换以下Lambda表达式时

     searchCritertiaHolder.put(AGED, (Person p)-> {p.filterAgedPerson(p);});

具有

              searchCritertiaHolder.put(AGED, Person::filterAgedPerson);

它给我编译错误。我正在使用java 8并通过eclipse编译。为什么会这样?为什么我不能将任何任意对象的实例方法的方法引用分配给消费者功能接口?

共有1个答案

岳硕
2023-03-14

您对 filterAgedPerson 的定义将 Person 作为参数,即使它不是静态方法。它不需要,如果你想把它用作消费者,也不应该这样做。

这样想可能会有所帮助:对非静态方法的方法引用总是采用一个“额外”参数,该参数用作参数。

使用当前代码结构解决此问题的最简单方法是修改 filterAgedPerson 方法,使其不将 Person 作为参数

   public void filterAgedPerson() {
      if (this.getAge() > 58) {
          agedPersons.add(person);
      }
   }

顺便说一下,您可能还想考虑让您的过滤器< code >成为谓词

 类似资料:
  • Test类是超级类,Fest是它的子类,因为我们知道静态方法不能被重写,即使我遇到了“静态方法不能在java中隐藏实例方法”这样的错误,有人能解释一下吗,提前谢谢。

  • 我不明白这一点: 没有这个,我可以做到: 为什么在第一种情况下我不能调用hello()方法,而在第二种情况下我可以调用?

  • 编译器在第3行给出了一个错误 此实例方法无法重写Abc中的静态方法 为什么静态方法不能被实例方法覆盖?

  • 这是创建ListenerContainerFactory的类 这是我用@KafKalistener注释的Listener类 这是KafkaListenerConfig类,它接受引导服务器、主题名称等。

  • 我很难理解为什么要编译以下代码: 我可以理解为什么第一个赋值是有效的-

  • 本文向大家介绍php给数组赋值的实例方法,包括了php给数组赋值的实例方法的使用技巧和注意事项,需要的朋友参考一下 数组就是一个键值对组成的语言结构,键类似于酒店的房间号,值类似于酒店房间里存储的东西。 如果你去某个酒店住店,服务员会告诉你房间号是多少,具体房间里有存储了什么,那就需要根据房间号进到房间里才知道了。 PHP有两种数组:索引数组、关联数组。索引和关联两个词都是针对数组的键而言的。 P

  • 问题内容: 有关语法的简单问题。为什么限制这样的表达式: 并只允许以下内容: ? 问题答案: 这是因为方法引用或lambda表达式的目标类型应该是功能接口。仅基于此,运行时将创建提供给定功能接口的实现的类的实例。将lambda或方法引用视为概念。将其分配给功能接口类型将赋予其具体含义。 此外,特定的lambda或方法引用可以具有多个功能接口作为其目标类型。例如,考虑以下lamda: 这个lambd

  • /usr/local/kafka2.12-2.6.0/config/server.properties 在开始动物园管理员和Kafka之后,创建一个新的主题 检查所有三个节点上的集群状态