在Java中按属性映射对象集合

时间:2015-10-11 13:27:49

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

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

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

然后,我定义了一个Client列表,如:

List<Client> clientList;

让我们说该List有很多已经初始化的客户端对象。如何绘制字段&#34;购买&#34;使用Java 8的每个客户端对象?

我尝试过类似的事情:

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

当然,它不起作用,但我无法找出(或找到)任何方法。我想要做的只是修改每一个&#34;购买&#34;列表中每个对象的值。在示例中,我添加了一个,但它可以是任何操作。

3 个答案:

答案 0 :(得分:1)

我只想使用for循环。

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

答案 1 :(得分: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的构造函数将购买作为输入并将操作结果映射到新客户端,如下所示:

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 :(得分:0)

您是否尝试过使用Java提供的Iterator?

(Y - 1) / (X - 1) = Z

(3.290 - 1) / (3.290 - 1) * 100 = 100.0%
(3.235 - 1) / (3.290 - 1) * 100 = 097.5%
(2.280 - 1) / (3.290 - 1) * 100 = 055.8%
(2.230 - 1) / (3.290 - 1) * 100 = 053.7%
(2.145 - 1) / (3.290 - 1) * 100 = 050.0%
(1.830 - 1) / (3.290 - 1) * 100 = 036.2%
(1.660 - 1) / (3.290 - 1) * 100 = 028.8%
(1.100 - 1) / (3.290 - 1) * 100 = 004.3%
(1.010 - 1) / (3.290 - 1) * 100 = 000.4%
(1.000 - 1) / (3.290 - 1) * 100 = 000.0%

或者将结果添加到地图或其他任何内容。