当前位置: 首页 > 知识库问答 >
问题:

Java-Stream-应用Collector groupingBy后,将对象列表收集到一组字符串中

左仰岳
2023-03-14

给定以下类:订单和项目,以及订单列表。

@Getter
@AllArgsConstructor
@ToString
public class Order {
    String customerName;
    List<Item> items;
}

@Getter
@AllArgsConstructor
@ToString
@EqualsAndHashCode
public class Item {
    long id;
    String name;
}

我需要创建一个mapMap

输入示例

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"))));

期望的输出将是

{Alex=[A, H, K, L], John=[A, B, C, F, G], Dave=[X, Y, Z]}

我已经尝试了很多方法,包括我下面的最后一次尝试,但是编译错误

Map<String, Set<String>> itemsByCustomerName =
    orders.stream().collect(groupingBy(
            Order::getCustomerName,
            mapping(order -> order.getItems().stream().map(Item::getName), toSet())));

错误:

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>

我如何获得订单地图,而不仅仅是按名称:

Map<String, List<Order>> ordersByName =
    orders.stream().collect(groupingBy(Order::getCustomerName));

地图

所以,我的问题是:在应用了分组后,如何将订单列表转换为一组项目名称?


共有2个答案

符献
2023-03-14
匿名用户

<代码>收集器。groupingBy(Order::getCustomerName,Collectors.toSet())在这种情况下应该可以工作。这里的第二个参数是groupingBy内部使用的收集器。

邢勇
2023-03-14

你很亲密。

由于您不需要将流元素转换为单个对象,而是从订单中提取项目集合,因此您需要不同的收集器-平映射()而不是映射()

Map<String, Set<String>> itemsByCustomerName =
    orders.stream().collect(Collectors.groupingBy(
        Order::getCustomerName,
        Collectors.flatMapping(order -> order.getItems().stream().map(Item::getName),
            Collectors.toSet())));
 类似资料:
  • 我是Mapstruct的新手。我有一个Word对象,它包含一个字符串值和一组它自己,我想把它映射到WordDTO,它包含一个值和一组字符串值。我不知道怎么做。正如我在注释中所说,mapstruct不能映射两个对象是有道理的,但如果它有帮助,我将错误放在下面: 我为映射实现了这个接口: 谢谢你的帮助。

  • 我现在正在学习lambda,我想知道如何用lambda用单行代码编写这段代码。

  • 在一个用例中,我有一个包含许多< code >的长字符串 我写了一个正则表达式(< code > " 例如:

  • 例如,我有一个类包含name和surname字段。 我想从的中收集一个的(名字和姓氏都在一起),但似乎无法对每个列表使用两次map或无法对每个列表使用两次stream。 我做错了什么?

  • 有一个用例,其中我有一个长的可以包含许多

  • 问题内容: 我想将包含的字符串转换为字符列表和字符哈希集。如何在Java中做到这一点? 问题答案: 您将不得不使用循环,或创建一个像这样的集合包装器,该包装器可用于原始char数组(或直接用于字符串)。 这是一个类似字符串的包装器: 不过,这是一个不变的列表。如果您想要一个可变的列表,请使用: 与此类似,您可以为其他原始类型实现此功能。 请注意,通常不建议使用此功能,因为对于每次访问,您都将进行装