此表达式的目标类型应该是功能接口

jav*_*Bee 0 java lambda java-8 method-reference

下面的代码给我一个编译错误

.filter(Book::getPrice >200)
Run Code Online (Sandbox Code Playgroud)

编译错误是:此表达式的目标类型应该是功能接口

public void skipData() {
    List<Book> bookList = books.stream()
                                **.filter(Book::getPrice >200)**
                                .skip(5)
                                .collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

我的Book.java类如下所示:

public final class Book {

private String title;
private String genre;
private double price;

public Book(String title, String genre, double price) { 
    this.title = title;
    this.genre = genre;
    this.price = price;
}

public double getPrice() {
    return price;
}

//other getters
}
Run Code Online (Sandbox Code Playgroud)

我试图在Eclipse(火星)和cmd线上运行它并看到同样的问题.

但如果我改变.filter(b -> b.getPrice() >200)它的工作原理.

我不清楚为什么方法参考在我的情况下不起作用.

And*_*eas 5

Book::getPrice > 200 不是有效的Java表达式.

可以采取一个lambda表达式作为参数,可以采取任何方法一个以下内容:

  • lambda表达式: b -> b.getPrice() > 200
  • 一个lambda块: b -> { return b.getPrice() > 200; }
  • 方法参考: Book::isPriceAbove200
  • 匿名类: new Predicate<Book>() { public boolean test(Book b) { return b.getPrice() > 200; }}

方法参考允许重用方法.