下面的代码在
处给出了编译错误.filter(Book::getPrice >200)
编译错误是: 此表达式的目标类型应该是功能接口
public void skipData() {
List<Book> bookList = books.stream()
**.filter(Book::getPrice >200)**
.skip(5)
.collect(Collectors.toList());
}
My 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
}
我试图在Eclipse(火星)和cmd线上运行它。看到同样的问题。
但如果我将其更改为.filter(b -> b.getPrice() >200)
则可行。
我不清楚为什么方法参考在我的情况下不起作用。
答案 0 :(得分:5)
Book::getPrice > 200
不是有效的Java表达式。
任何可以将lambda表达式作为参数的方法都可以使用以下一个:
b -> b.getPrice() > 200
b -> { return b.getPrice() > 200; }
Book::isPriceAbove200
new Predicate<Book>() { public boolean test(Book b) { return b.getPrice() > 200; }}
方法参考允许重用方法。
答案 1 :(得分:0)
filter方法使用一个函数,它接受一个参数并返回一个布尔值来确定是接受元素还是过滤它们。
Book::getPrice >200
不是任何形式的函数。它甚至不是boolean
,因为您将方法引用与整数进行比较,从而产生垃圾。
b -> b.getPrice() >200
是一个函数(lambda),它接受您要过滤的流的元素(b
)并检查该特定元素的价格是否可接受。