2017-11-15 16 views
1

私は以下のクラスを持っている:Java 8でメソッド参照を使用して非静的クラスから非静的メソッドを呼び出す方法

class Book { 
    private String genre; 
    public Book(String genre) {this.genre = genre;} 
    public String getGenre() {return genre;} 
    public class BookFilter { 
     public boolean isFiction(Book b) { 
      return b.getGenre().equals("fiction"); 
     } 
    } 
} 

私はbooksリストにBookクラスのいくつかのオブジェクトを追加して、今、私はメソッドの参照を使用してストリームをフィルタリングします。下のコードに示すように、lambda expressionを使用するとコードは正常に動作しますが、method referenceを使用するとコンパイルされません。

books.stream() 
    .filter(b->b.new BookFilter().isFiction(b)) //Works fine 
    //.filter(new Book().new BookFilter()::isFiction); //Will not compile 

私はBookFilterstatic nested classだった場合、次のコード行は問題なくコンパイルを通過することを知っています。

.filter(new Book.BookFilter()::isFiction) 

は、どのように私は、メソッドの参照を使用してBookクラスからisFiction()メソッドを呼び出していますか?

ありがとうございます!

+0

'.filter(b - > b.getGenre()。equals(" fiction "))'を直接使用しない理由はありますか? @AlexisC。 –

+0

私はそれを使用していますが、私は同じことがメソッド参照を使用して達成できるかどうかを知りたがっていました。 –

+5

あなたの内部の 'BookFilter'クラスを静的にすることができます。なぜなら、あなたが' isFiction'関数にパラメータとして与えた特定のインスタンスブックに結びつける理由がないからですあなたの 'Stream#filter'メソッドにそれを入れてください)。 @AlexisC。 –

答えて

4

あなたの注目されたfilterコールがコンパイルをパスしない理由は、Bookクラスにパラメータなしのコンストラクタがないことです。

あなたがそれに

public Book() {} 

を追加する場合は、

books.stream().filter(new Book().new BookFilter()::isFiction); 

は、コンパイルを通過します。

関連する問題