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

标签 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;
    }
}

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

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/

相关文章:

java - 将 XML 文件转换为 Java LinkedHashSet

java - 如果我们在父列表中添加元素,为什么 JDK 会向 UnmodifyableList 添加一个元素

java - 中断的 Java 线程真的可以跳过 finally 子句吗?

java - 打开文件时未找到 Activity 异常 android

java - 尝试使用软编码(基于输入的数组大小)制作掷骰子java应用程序,得到ArrayIndexOutOfBoundsException

java - Java Collections 在使用 Collections.addAll() 时什么时候抛出 NullPointerException

c# - 如何展平 C# Lambda 表达式中嵌套拆分的结果

c++ - C++ 中的 lambda 返回类型

c# - Linq 查询自引用对象以获取无子元素

java - 如何在 Scala 中扩展包含泛型方法的 Java 接口(interface)?