Как найти в Java конкретный элемент для печати в списке объектов с несколькими элементами?

#java #json #list #stream #iterator

Вопрос:

Короче говоря, я проанализировал все json отсюда в список объектов. Но у меня возникли проблемы с поиском определенного объекта. Со всеми примерами в списках поиска в Интернете я, кажется, не могу этого понять.

Я прошу пользователя ввести число в int checkId и checkUserId, а затем сравнить его. Если оно совпадает, то следует распечатать заголовок.

 Iterator < Post > iter = posts.iterator();
while (iter.hasNext()) {
  if (Objects.equals(iter.next().getUserId(), checkUserId)) {
    System.out.println("found UserId");

    if (Objects.equals(iter.next().getId(), checkId)) {
      System.out.println("found Id");
      //prints the title of object
    }
  }
}
 

А потом я попытался использовать поток

 List<Post> result = posts.stream()
        .filter(title -> checkId.equals(getId()))
        .findAny()
        .orElse(null);
 

Весь код я клонировал у этого замечательного парня. https://github.com/danvega/httpclient-tutorial

Комментарии:

1. сохраните iter.next() в переменной, не вызывайте ее дважды, каждый вызов перемещает курсор !

Ответ №1:

Ваша первая попытка не работает, потому что вы дважды продвигаете итератор на каждой итерации путем вызова next . Вместо этого сохраните результат Iterator#next и используйте его.

 Iterator<Post> iter = posts.iterator();
 while(iter.hasNext()){
        Post post = iter.next();
        if(Objects.equals(post.getUserId(), checkUserId)) {
            System.out.println("found UserId");
            System.out.println(post.getTitle());
        }
    }
 

С потоками:

 List<String> titles = posts.stream().filter(post-> checkId.equals(post.getId()))
                        .map(Post::getTitle).collect(Collectors.toList());
titles.forEach(System.out::println);
 

Комментарии:

1. Спасибо. Это сводило меня с ума в течение нескольких часов.

2. @TerryLight Рад помочь.

3. С вашей помощью я обнаружил, что это тоже работает. « для (Post сообщение : сообщения) { if ((Objects.равно(post.getUserId(), checkUserId))amp;amp; (Objects.равно(post.getId(), checkId))) { System.out.println(«найден идентификатор пользователя»); System.out.println(post.getTitle()); } } «