在对象数组中搜索某些String

use*_*376 2 java arraylist java-8 java-stream

我找不到答案所以我必须发布一个新问题 - 虽然它似乎与已经在这里提出的其他几个问题相似 - 但重点是:

我有一些列表,例如:

private static List<Book> books = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

它包含了Book我所拥有的类的对象

private String title;
private String author;
Run Code Online (Sandbox Code Playgroud)

和吸气者和制定者.

现在我有了一个新对象Book(通过参数/ servlet从webform获得),我想检查新书的标题是否已经在列表中books.如果它已在该列表中,则打印一些控制台输出.如果不是,我想将整个新对象添加到列表中.为了做到这一点,我尝试使用常规的foreach循环来比较标题.有时候它有效,有时候没有(有时我的功能是以正确的方式比较两个标题,但有时不是 - 我不知道为什么).我知道有一种更好的方法可以使用Java 8.但是,对于Java 8,我是新手.有人能告诉我一个很好的方法吗?

Eug*_*ene 6

我不知道你为什么要特别使用java-8功能,但它可以这样做:

boolean isPresent = books.stream()
     .anyMatch(book -> book.getTitle().equals(inputBook.getTitle()));

if(isPresent){
     ...  console print
} else {
     add it to books
}
Run Code Online (Sandbox Code Playgroud)

我认为这可能会更加通用btw,有一个方法可以接受一个Predicate.

private boolean exists(List<T> list, Predicate<T> predicate) {    
    return list.stream().anyMatch(predicate);
}
Run Code Online (Sandbox Code Playgroud)

这样你以后可以匹配任何你喜欢的东西:

 boolean exists = exists(books, p -> p.getTitle().equals(b.getTitle()));
Run Code Online (Sandbox Code Playgroud)

要么 :

 Predicate<Book> first = p -> p.getTitle().equals(b.getTitle());
 Predicate<Book> second = first.and(p -> p.getTitle().equals(b.getTitle()));
 boolean exists = exists(books, second);
Run Code Online (Sandbox Code Playgroud)