2015-09-13 1 views
0

ci-dessous morceau de code me donne une erreur de compilation àLe type cible de cette expression doit être une interface fonctionnelle

.filter(Book::getPrice >200) 

erreur de compilation est: Le type cible de cette expression devrait être une interface fonctionnelle

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

classe Mon Book.java se présente comme suit:

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 
} 

J'ai essayé d'exécuter ceci sur Eclipse (Mars) et aussi sur la ligne cmd & vu le même problème. Mais si je le change en .filter(b -> b.getPrice() >200) cela fonctionne.

Il n'est pas clair pour moi pourquoi la référence de méthode ne fonctionne pas dans mon cas.

+0

Quelle est la déclaration de la variable 'books'? –

Répondre

4

Book::getPrice > 200 n'est pas une expression Java valide.

Toute méthode qui peut prendre une expression lambda en tant que paramètre, peut prendre une de ce qui suit:

  • une expression lambda: b -> b.getPrice() > 200
  • Un bloc de lambda: b -> { return b.getPrice() > 200; }
  • Une référence de procédé : Book::isPriceAbove200
  • Une classe anonyme: new Predicate<Book>() { public boolean test(Book b) { return b.getPrice() > 200; }}

Une référence de méthode permet la réutilisation d'une méthode.

0

La méthode de filtrage utilise une fonction qui prend un seul argument et renvoie un booléen pour déterminer s'il faut accepter les éléments ou les filtrer.

Book::getPrice >200 n'est pas une fonction d'aucune sorte. Ce n'est même pas un boolean puisque vous comparez une référence de méthode à un entier, ce qui entraîne une corbeille.

b -> b.getPrice() >200 est une fonction (lambda) qui accepte l'élément du flux que vous filtrez (b) et vérifie si le prix de cet élément particulier est acceptable.