在对象数组中搜索某些String

时间:2017-08-07 08:38:18

标签: java arraylist java-8 java-stream

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

我有一些列表,例如:

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

它包含类Book的对象,我有

private String title;
private String author;

和getters&amp; setters。

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

4 个答案:

答案 0 :(得分:6)

我无法告诉您为什么要专门使用java-8功能,但可以这样做:

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

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

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

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

答案 1 :(得分:3)

您可以尝试使用findAnyOptional

Optional<Book> found = books.stream().filter(p -> p.getTitle().equalsIgnoreCase(newBook.getTitle())).findAny();
if (found.isPresent()){
    System.out.println(found.get());
}
else {
    books.add(newBook);
}

答案 2 :(得分:0)

如果你想要有点花哨和有条不紊,你可以创建一个&#39;图书馆&#39;继承或具有ArrayList的类。那么你需要的是一本书的equals函数,它在标题上使用String .equals()。然后,contains方法可以在元素上调用此循环。

答案 3 :(得分:0)

首先,您必须创建吸气剂&amp; setter for the class Book。这样的演示就是这样的:

class Book{
    private String title;
    private String author;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }
}

现在,您可以执行以下操作来浏览每个对象的标题,并将其与新输入的对象标题进行比较。

    Scanner in  = new Scanner(System.in);
    List<Book> books = new ArrayList<>();
    Book b = new Book();
    System.out.println("Enter the title:");
    String t = in.nextLine();
    b.setTitle(t);                          //optional
    for (Book book:books
         ) {
        if(book.getTitle().equals(t))
            System.out.println("Title exists");
        else
            System.out.println("Title does not exist"); 
    }