Целевой тип этого выражения должен быть функциональным интерфейсом.

Ниже фрагмент кода дает мне ошибку компиляции в

.filter(Book::getPrice >200)

Ошибка компиляции: целевой тип этого выражения должен быть функциональным интерфейсом.

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

Мой класс 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 (Mars), а также в строке cmd и увидел ту же проблему.

Но если я изменю его на .filter(b -> b.getPrice() >200), он сработает.

Мне непонятно, почему ссылка на метод не работает в моем случае.


person javaBee    schedule 13.09.2015    source источник
comment
Каково объявление переменной books?   -  person Jim Garrison    schedule 13.09.2015


Ответы (2)


Book::getPrice > 200 не является допустимым выражением Java.

Любой метод, который может принимать лямбда-выражение в качестве параметра, может принимать один из следующего:

  • Лямбда-выражение: b -> b.getPrice() > 200
  • Лямбда-блок: b -> { return b.getPrice() > 200; }
  • Ссылка на метод: Book::isPriceAbove200
  • Анонимный класс: new Predicate<Book>() { public boolean test(Book b) { return b.getPrice() > 200; }}

Ссылка на метод позволяет повторно использовать метод.

person Andreas    schedule 13.09.2015

Метод filter использует функцию, которая принимает один аргумент и возвращает логическое значение, чтобы определить, следует ли принимать элементы или отфильтровывать их.

Book::getPrice >200 не является функцией. Это даже не boolean, поскольку вы сравниваете ссылку на метод с целым числом, что приводит к мусору.

b -> b.getPrice() >200 — это функция (лямбда), которая принимает элемент потока, который вы фильтруете (b), и проверяет, приемлема ли цена этого конкретного элемента.

person Mad Physicist    schedule 13.09.2015