【问题标题】:Map a Collection of Objects by property in Java在 Java 中按属性映射对象集合
【发布时间】:2015-10-11 13:27:49
【问题描述】:

我有一个这样的自定义类:

public class Client {
    public int ID;
    public String Name;
    public double buys;
    public double getBuys() {
        return this.buys;
    }
}

然后,我定义了一个客户端列表,例如:

List<Client> clientList;

假设 List 有很多已经初始化的客户端对象。如何使用 Java 8 映射每个客户端对象的“购买”字段?

我尝试过类似的方法:

List<Client> clientList2 = clientList.stream().map(c.getBuys() -> c.getBuys() + 1).collect(Collections.toList());

当然,它不起作用,但我无法弄清楚(或找到)任何方法来做到这一点。我想做的只是修改列表中每个对象的每个“购买”值。在示例案例中,我添加了一个,但它可以是任何操作。

【问题讨论】:

    标签: java collections lambda java-8 java-stream


    【解决方案1】:

    阅读您的评论后,您想要通过应用自定义函数来修改每个客户的购买。考虑以下方法:

    private static List<Client> mapClients(List<Client> clients, DoubleUnaryOperator op) {
        return clients.stream()
                      .peek(c -> c.setBuys(op.applyAsDouble(c.getBuys())))
                      .collect(Collectors.toList());
    }
    

    或以下简单的for循环:

    private static List<Client> mapClients(List<Client> clients, DoubleUnaryOperator op) {
        for (Client client : clients) {
            client.setBuys(op.applyAsDouble(client.getBuys()))
        }
        return clients;
    }
    

    此方法将改变每个客户并使用运算符的结果设置购买(DoubleUnaryOperator 是一个将double 作为参数并返回double 类型的值的运算符)。操作员将购买作为输入来进行计算。然后,您可以像这样使用它:

    mapClients(clients, d -> d + 1); // every buys are added 1
    mapClients(clients, d -> 2*d); // every buys are multiplied by 2
    

    请注意,此解决方案变异 现有对象,这不是一个好的做法。最好有一个 Client 的构造函数将购买作为输入并将操作结果映射到新的 Client,如下所示:

    private static List<Client> mapClients(List<Client> clients, DoubleUnaryOperator op) {
        return clients.stream()
                      .map(c -> new Client(op.applyAsDouble(c.getBuys())))
                      .collect(Collectors.toList());
    }
    

    【讨论】:

      【解决方案2】:

      我只会使用for 循环。

      for (Client client : clientList)
          client.setBuys(client.getBuys() + 1);
      

      【讨论】:

        【解决方案3】:

        你试过用Java提供的Iterator吗?

        for( Client c: clientList){ 
        System.out.println(c.getBuys());
        }
        

        或者将结果添加到地图或其他任何东西。

        【讨论】:

          猜你喜欢
          • 2012-11-08
          • 2021-11-24
          • 2017-03-16
          • 2019-04-06
          • 1970-01-01
          • 2011-08-21
          • 1970-01-01
          • 2020-06-27
          • 1970-01-01
          相关资源
          最近更新 更多