在 Java 中如何在具有多个元素的对象列表中找到用于打印的特定元素?

问题描述 投票:0回答:2

长话短说,我从here解析了所有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

java json list stream iterator
2个回答
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);

0
投票

由于

posts
List
并且这是一个简单的迭代,我建议在基于迭代器的 while 循环上使用 for-each 循环:

for (Post post : posts) {
    if (Objects.equals(post.getUserId(), checkUserId)
            && Objects.equals(post.getId(), checkId)) {
        System.out.println(post.getTitle());
    }
}

(为了完整性:如另一个答案中所述,基于迭代器的方法的问题是每次循环迭代多次调用

iter.next()
,而不是每次迭代仅调用一次)。

© www.soinside.com 2019 - 2024. All rights reserved.