wan*_*Dev 3 java java-stream collectors groupingby
给定以下类Order和Item以及 s 的列表Order。
@Getter
@AllArgsConstructor
@ToString
public class Order {
String customerName;
List<Item> items;
}
@Getter
@AllArgsConstructor
@ToString
@EqualsAndHashCode
public class Item {
long id;
String name;
}
Run Code Online (Sandbox Code Playgroud)
我需要创建一个映射Map<String,Set<String>> itemsByCustomerName,其中键是客户名称以及属于该客户名称Order的所有名称的一组名称。Item
输入示例:
List<Order> orders = List.of(
new Order("John", List.of(new Item(1, "A"), new Item(2, "B"), new Item(3, "C"))),
new Order("Alex", List.of(new Item(1, "A"), new Item(8, "H"), new Item(11, "K"))),
new Order("John", List.of(new Item(1, "A"), new Item(6, "F"), new Item(7, "G"))),
new Order("Alex", List.of(new Item(1, "A"), new Item(8, "H"), new Item(12, "L"))),
new Order("Dave", List.of(new Item(24,"X"), new Item(25,"Y"), new Item(26, "Z"))));
Run Code Online (Sandbox Code Playgroud)
期望的输出是
{Alex=[A, H, K, L], John=[A, B, C, F, G], Dave=[X, Y, Z]}
Run Code Online (Sandbox Code Playgroud)
我尝试了很多方法,包括下面的最后一次尝试,但出现编译错误
Map<String, Set<String>> itemsByCustomerName =
orders.stream().collect(groupingBy(
Order::getCustomerName,
mapping(order -> order.getItems().stream().map(Item::getName), toSet())));
Run Code Online (Sandbox Code Playgroud)
错误:
Required type:
Map<String, Set<String>>
Provided:
Map<String, Set<Object>>
no instance(s) of type variable(s) R exist so that Stream<R> conforms to String inference variable T
has incompatible bounds: equality constraints: String lower bounds: Stream<R81591>
Run Code Online (Sandbox Code Playgroud)
我怎样才能获得而不只是按名称排列的订单地图:
Map<String, List<Order>> ordersByName =
orders.stream().collect(groupingBy(Order::getCustomerName));
Run Code Online (Sandbox Code Playgroud)
到一个Map<String, Set<Item>>或更好的Map<String, Set<String>>一组项目名称?
所以,我的问题是:申请后如何将订单列表转换为一组商品名称groupingBy?
你们非常亲密。
由于您不需要将流元素 转换为单个对象,而是从order中提取项目集合,因此您需要一个不同的收集器-而不是.flatMapping()mapping()
Map<String, Set<String>> itemsByCustomerName =
orders.stream().collect(Collectors.groupingBy(
Order::getCustomerName,
Collectors.flatMapping(order -> order.getItems().stream().map(Item::getName),
Collectors.toSet())));
Run Code Online (Sandbox Code Playgroud)