【发布时间】:2019-11-28 21:30:23
【问题描述】:
我有一个像这样的类电影:
public class Movie {
private int id, duration, publishingYear;
private String title, translation;
public Movie(int id, int duration, int publishingYear, String title, String translation) {
super();
this.id = id;
this.duration = duration;
this.publishingYear = publishingYear;
this.title = title;
this.translation = translation;
}
public Predicate<Movie> titleFilter(String filter){
return m -> m.getTitle().toLowerCase().contains(filter.toLowerCase());
}
public Predicate<Movie> translationFilter(String filter){
return m -> m.getTranslation().toLowerCase().contains(filter.toLowerCase());
}
}
如何在使用方法引用时链接谓词过滤器?我知道方法引用可以看作是 lambdas 仅调用特定方法的简写。在我正在阅读的书中,它说:“...方法参考让您可以从现有方法实现中创建 lambda 表达式...”。那么,为什么我不能这样做呢?
ArrayList<Movie> filteredMovies = (ArrayList<Movie>) app.getMovies().stream()
.filter((Movie::titleFilter(titleFilter)).or(Movie::translationFilter(translationFilter)))
.collect(Collectors.toList());
我知道这会起作用:
Predicate<Movie> titlePredicate = ( m -> m.getTitle().toLowerCase().contains(titleFilter));
Predicate<Movie> translationPredicate = ( m -> m.getTitle().toLowerCase().contains(translationFilter));
ArrayList<Movie> filteredMovies = (ArrayList<Movie>) app.getMovies().stream()
.filter(titlePredicate.or(translationPredicate))
.collect(Collectors.toList());
还有这个(只需插入 filter() ):
public boolean tFilter(String filter){
return this.getTranslation().toLowerCase().contains(filter.toLowerCase());
}
我最近开始使用 lambdas 和 Stream API。在我们大学的课程中,没有提到流。所以我认为我自己开始。新手。
【问题讨论】:
标签: java lambda filter java-stream predicate