我有一个像这样的自定义类:
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());
当然,它不起作用,但我无法弄清楚(或找到)任何方法来做到这一点。我想做的只是修改列表中每个对象的每个“购买”值。在示例中,我添加了一个,但它可以是任何操作。
最佳答案
阅读您的评论后,您想要的是通过应用自定义函数来修改每个客户的购买。考虑以下方法:
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 类型的值的运算符
)。运算符(operator)将购买量作为输入来进行计算。然后,你可以像这样使用它:
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());
}
关于java - 在 Java 中按属性映射对象集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33065534/