【问题标题】:How to loop through a List of Objects如何遍历对象列表
【发布时间】:2020-06-04 18:42:29
【问题描述】:

我有一个名为Group 的课程。在Group 内部有一个包含Customer 类型对象的列表,如下所示:

Group.java:

private List<Customers> customers;

public List<Customer> getCustomers() {
   return customers;
}

然后,像上面一样,Customer 类的列表包含 EmailAddress 类型的对象,如下所示:

Customer.java:

private List<EmailAddress> emailAddresses;

public List<EmailAddress> getEmailAddress() {
   return emailAddresses;
}

我希望能够将此电子邮件地址列表放入我自己的列表中,然后我可以按照自己的意愿进行操作。所以在我的Main.java 我有:

Main.java:

List<Customer> customerList = group.getCustomers(); //group is the object to get <Customer> List

for (int i=0; i<customerList.size(); i++) {

List<EmailAddress> emails = customerList.get(i).getEmailAddresses();

}

然后,在这个 for 循环之外,我是否会有一个我可以使用的所有客户电子邮件的列表?这是填充列表的正确方法,然后我可以利用该列表并从该循环外部提取数据吗?在循环之外,我希望能够查看列表的不同部分,例如:

emails.get(3); 

emails.get(7);

由我自己决定。

【问题讨论】:

  • 警告:当您返回一个裸列表时,可能会出现问题。如果列表是可变的,那么调用者可能会更改您的列表,这会反映在您的GroupCustomer 实例中。这可能不是你想要的。

标签: java list loops


【解决方案1】:

需要在for循环外初始化列表

List<EmailAddress> emails = new ArrayList<>();

for (int i=0; i<customerList.size(); i++) {
    emails.add(customerList.get(i).getEmailAddresses());
}

【讨论】:

  • 然后我会在 for 循环之外获得完整列表吗?
  • 是的,在初始化列表的方法中。如果您在方法之外需要它,则应将其声明为类的字段或在方法中返回。
  • 应该是addAll(customerList.get(i).getEmailAddresses())
【解决方案2】:
List<Customer> customerList = group.getCustomers();
List<EmailAddress> finalEmailAddressList = new ArrayList<>();

for (Customer : customerList) {
    if (customer != null) {
        finalEmailAddressList.add(customer.getEmailAddresses());
    }
}

这应该最终为您提供所有电子邮件地址的列表。您还可以使用addAll 方法将集合添加到集合(也在特定索引处),在本例中为列表。

【讨论】:

    【解决方案3】:

    如果需要从外部范围访问数据,则数据必须存在于外部范围中。因此,需要在循环的外部范围内声明:

    List<Customer> customerList = group.getCustomers();
    List<EmailAddress> emails = new ArrayList<>(customerList.size());
    for (Customer customer : customerList) {
        emails.addAll(customer.getEmailAddresses();
    }
    

    【讨论】:

      【解决方案4】:

      你可以用流来做到这一点:

      List<Group> groupList = ...
      List<EmailAddress> address = groupList
        .stream()
        .flatMap(g -> g.getCustomers().stream())
        .flatMap(c -> c.getEmailAddresses().stream())
        .collect(Collectors.toList());
      

      【讨论】:

        【解决方案5】:

        你可以用函数式的方式来做:

        List<EmailAddress> emails = costumerList.stream()
            .map(Customer::getEmailAddresses)
            .flatMap(Collection::stream)
            .collect(Collectors.toList());
        

        这里最有趣的部分是 flatMap() 方法,它做了两件事:

        • 它使用Collection.stream() 方法的method referenceList&lt;EmailAddress&gt; 映射Stream&lt;EmailAddress&gt;
        • 展平结果,使结果的类型为Stream&lt;EmailAdress&gt; 因此,collect() 方法的结果将是 List&lt;EmailAdress&gt; 类型

        相反,如果flatMap() 行被省略,结果将是List&lt;List&lt;EmailAddress&gt;&gt; 类型。 同样,如果使用map() 方法而不是flatmap(),则结果将是List&lt;Stream&lt;EmailAddress&gt;&gt; 类型

        【讨论】:

        • 应该是.map(Customer::getEmailAddresses).flatMap(Collection::stream)
        • @knitti 谢谢!更新了,手头有 IDE 会更容易
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-30
        • 2019-02-11
        • 2011-08-19
        • 2018-05-08
        • 2015-03-17
        • 2011-06-11
        相关资源
        最近更新 更多