簡體   English   中英

為什么實例方法的Java方法引用無法分配給Consumer接口

[英]Why Java Method Reference of instance method cannot be assigned to Consumer interface

這是我的代碼:

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進行編譯。 為什么會這樣? 為什么我不能將任意對象的實例方法的方法引用分配給消費者功能接口?

您對filterAgedPerson定義將Person作為參數,即使它不是靜態方法。 它不需要,如果你想將它用作Consumer<Person> ,它就不應該。 你最終得到的是與BiConsumer<Person, Person>兼容的東西。

以這種方式思考它可能會有所幫助:對非靜態方法的方法引用總是采用“額外”參數,並將其用作this參數。

使用當前代碼結構修復此問題的最簡單方法是修改filterAgedPerson方法,不要將Person作為參數

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

順便說一句,您可能還想考慮使用過濾器Predicate<Person>而不是Consumer<Person> ,並將結果處理移動到其他地方。 隨着事情變得更加復雜,這將為您提供更大的靈活性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM