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

时间:2015-09-13 03:03:25

标签: java lambda java-8 method-reference

下面的代码在

处给出了编译错误
.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)则可行。

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

2 个答案:

答案 0 :(得分: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; }}

方法参考允许重用方法。

答案 1 :(得分:0)

filter方法使用一个函数,它接受一个参数并返回一个布尔值来确定是接受元素还是过滤它们。

Book::getPrice >200不是任何形式的函数。它甚至不是boolean,因为您将方法引用与整数进行比较,从而产生垃圾。

b -> b.getPrice() >200是一个函数(lambda),它接受您要过滤的流的元素(b)并检查该特定元素的价格是否可接受。