有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java分组列表<CustomerOrder>到地图<Gender,Money>

public class CustomerOrder {

    private final Gender gender;
    private final Order order;

    public Gender getGender() {
        return gender;
    }

    public Order getOrder() {
        return order;
    }

}

public class Order {

    private final long orderAmount;

    public long getOrderAmount() {
        return orderAmount;
    }

}

我想实现java流媒体的等效功能:

SELECT Gender, SUM(orderAmount) FROM orders
GROUP BY Gender;

谢谢

编辑:我过度简化了问题-CustomerOrder包含一个订单,其中包含orderAmount

我设法通过以下方式到达Map<Gender, List<Long>>

Map<Gender, List<Long>> map = orders.stream()
    .collect(Collectors.groupingBy(CustomerOrder::getGender))

共 (2) 个答案

  1. # 1 楼答案

    您可以使用^{},它有3个参数:

    • 生成关键点的映射函数
    • 生成值的映射函数
    • 一种合并函数,用于解决与同一键关联的值之间的冲突

    代码如下:

    Map<Gender, Long> result = customerOrders.stream()
        .collect(Collectors.toMap(
            CustomerOrder::getGender,
            co -> co.getOrder().getOrderAmount(),
            Long::sum));
    

    如果需要指定返回映射的类型,即如果需要按性别对映射排序,则可以使用Collectors.toMap的4参数重载:

    Map<Gender, Long> result = customerOrders.stream()
        .collect(Collectors.toMap(
            CustomerOrder::getGender,
            co -> co.getOrder().getOrderAmount(),
            Long::sum,
            TreeMap::new));
    
  2. # 2 楼答案

    list.stream().collect(Collectors.groupingBy(CustomerOrder::getGender,
                Collectors.summingLong(CustomerOrder::getOrderAmmount));
    

    编辑

    list.stream().collect(Collectors.groupingBy(CustomerOrder::getGender,
                Collectors.summingLong(co -> co.getOrder().getAmmount()));
    

    我没有编译这个,但是应该可以工作(使用较小的替换)