java - 在对象数组中搜索特定字符串

标签 java arraylist java-8 java-stream

我找不到答案,所以我必须发布一个新问题 - 尽管它似乎与此处已经提出的其他问题类似 - 但重点是:

我有一些列表,例如:

private static List<Book> books = new ArrayList<>();

它包含类 Book 的对象,我已经在其中

private String title;
private String author;

以及 getter 和 setter。

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

最佳答案

我不知道为什么你想专门使用 java-8 功能来做到这一点,但可以这样做:

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

if(isPresent){
     ...  console print
} else {
     add it to books
}

我认为这可以做得更通用一点,有一个可以接受谓词的方法。

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

以便您稍后可以匹配任何您喜欢的内容:

 boolean exists = exists(books, p -> p.getTitle().equals(b.getTitle()));

或者:

 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);

关于java - 在对象数组中搜索特定字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45542659/

相关文章:

VB.net 按对象名称排序 Arraylist

java - 任何人都可以解释这个声明 - "The point of all lambdas is deferred execution"

java - 以 Java 8 风格重构 if-else if 链

java - jfreeChart 中的甘特图?

java - 令人费解的 map 行为

java - 什么是软可达对象?

java - 在第二项启动自定义阵列适配器

java - java反射中找不到类

java - 将整个 JSON 对象添加到 ArrayList

java - 如何使用 java 8 lambda 表达式遍历两个流并保持计数