Java 8 流和列表分组

问题描述 投票:0回答:2

我有一个订单列表,我想使用 Java 8 streamCollectors.groupingBy:

按用户对它们进行分组
orderList.stream().collect(Collectors.groupingBy(order -> order.getUser())

这将返回包含用户和订单列表的地图:

Map<User, List<Order>>

我不需要整个对象 User 只是它的一个字段 username 这是一个 String,所以我想得到这样的东西:

Map<String, List<Order>>

我尝试使用 Stream.map 将用户映射到用户名字段,但无法正确完成。我怎样才能尽可能简单地做到这一点?

java java-8 java-stream collectors
2个回答
15
投票

您可以将

groupingBy
收集器与
username
一起使用,而不是整个
User
对象:

orderList.stream().collect(Collectors.groupingBy(order -> order.getUser().getUsername())

0
投票

可以使用Collectors -> groupingBy 和映射来实现结果。

List<Order> orders = Arrays.asList(
                new Order(10, "Order 12345"),
                new Order(20, "Order 12346"),
                new Order(10, "Order 12347"),
                new Order(30, "Order 12348"),
                new Order(20, "Order 12389"),
                new Order(20, "Order 12390")
        );

        Map<Integer, List<String>> orderList = orders.stream()
                .collect(Collectors.groupingBy(Order::getUserId,
                        Collectors.mapping(Order::getOrderId, Collectors.toList())));

        System.out.println(orderList);
    }

输出:

{20=[Order 12346, Order 12389, Order 12390], 10=[Order 12345, Order 12347], 30=[Order 12348]}
© www.soinside.com 2019 - 2024. All rights reserved.