在For中使用Lambda和Streams并返回结果

awy*_*ah2 5 java foreach lambda java-stream

我最近一直在学习lambda和流,并且真的很早就投入了深渊。

我目前有一个书的数组列表,用户输入一个单词,如果该单词等于书的作者或书名,则调用书toString(该书的所有属性格式正确)并返回。没有lambda非常容易。但是对于lambda,我似乎无法弄清楚如何解决所有问题。

另外,对于lambda,我必须过滤出阵列中状态为已损坏或已删除的所有书籍。

事情是我必须从流返回结果以最终显示在gui中,但似乎无法返回流的任何值。

我有一个谓词,它将尝试进行输入参数的匹配。我不知道这是否正确,我非常努力地尝试。

我只是想知道我需要进行必要的更改才能使其正常工作吗?

public String getBookByTitleOrAuthor(String titleOrAuthor) {
    books.stream()
         .filter(BookPredicate.matchTitleOrAuthor(titleOrAuthor))
         .filter(returnedBook -> returnedBook.getBookStatus() != 
            Book.bookStatus.Damaged && returnedBook.getBookStatus() != 
            Book.bookStatus.Deleted)
         .forEach(returnedBook -> returnedBook.toString());

}


// My predicate
public static Predicate<Book> matchTitleOrAuthor(String titleOrAuthor) {
    return b -> titleOrAuthor.equals(b.getTitle()) || 
    titleOrAuthor.equals(b.getAuthor());
}
Run Code Online (Sandbox Code Playgroud)

在此先感谢大家!抱歉,如果这是一个愚蠢的问题。

我的图书状态枚举和getBookStatus:

 public bookStatus getBookStatus() {
         return this.bookStatus;
    }

      public enum bookStatus {
       Available,
       Reserved,
       Borrowed,
       Damaged,
       Deleted

     }
Run Code Online (Sandbox Code Playgroud)

And*_*lko 2

forEach返回,void而你需要一个String. 但我不会去String。该方法表示“我按标题或作者返回一本书”,因此用户会期望一个Book实例。

public Book getBookByTitleOrAuthor(String titleOrAuthor) {
    return books.stream()
                .filter(BookPredicate.matchTitleOrAuthor(titleOrAuthor))
                .filter(b -> {
                               final Book.bookStatus status = b.getBookStatus();
                               return status != null && 
                                      status != Book.bookStatus.Damaged && 
                                      status != Book.bookStatus.Deleted; 
                })  // can be moved into a BookPredicate method as well
                .findAny()
                .orElseThrow(() -> new IllegalArgumentException("There is no book for the given author or title."));
}
Run Code Online (Sandbox Code Playgroud)