#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()); } } «