当前位置: 首页 > 面试题库 >

使用groupingBy的类属性的平面映射收集器

屠杰
2023-03-14
问题内容

我上这堂课

class Assignment {
  private Integer index;
  private List<Quantity> quantities;
}

然后,我有该类对象的列表。

List<Assigment> assignments = new ArrayList<>();

有没有一种方法创建一个Map包含from AssignmentList<Quantity>as值的索引

到目前为止,这是我尝试过的。

assignments.stream().collect(groupingBy(Assignment::getIndex));

但这给我一个Map<Integer, List<Assignment>>,我想要一个Map<Integer, List<Quantity>>

我已经尝试过使用forEach方法-它可以工作-但我确定必须有一种方法可以在一个衬里中进行操作-
或者至少仅使用collectgroupingBy方法


问题答案:

似乎没有平面映射收集器可groupingBy在Java8中用作下游,但已被Java9提出并接受:https
://bugs.openjdk.java.net/browse/JDK-8071600

public static <T, U, A, R>
    Collector<T, ?, R> flatMapping(Function<? super T, ? extends Stream<? extends U>> mapper,
                                   Collector<? super U, A, R> downstream) {
        BiConsumer<A, ? super U> downstreamAccumulator = downstream.accumulator();
        return Collector.of(downstream.supplier(),
                            (r, t) -> mapper.apply(t).sequential().forEach(u -> downstreamAccumulator.accept(r, u)),
                            downstream.combiner(),
                            downstream.finisher(),
                            downstream.characteristics().stream().toArray(Collector.Characteristics[]::new));
    }

如果使用该代码,并且还添加了一个返回的quantities方法,则可以使用以下代码:Assignment``Stream<Quantity>

Map<Integer, List<Quantity>> result = assignments.stream()
    .collect(groupingBy(Assignment::getIndex, 
        flatMapping(Assignment::quantities, toList())));


 类似资料:
  • 由于我不想多次使用流来单独收集每个属性,也不想使用来收集每个属性,是否有任何方法可以用单个流来获得上述属性。

  • 问题内容: 如何访问模型的Hibernate映射以找出属性的列名? 列名未在映射中指定,因此Hibernate自动生成它-我想创建一个包含此列名的本机SQL语句。 问题答案: 感谢Jherico,我发现了如何做到这一点:

  • 我有这个简单的Bean类: 在我的主类中,我在列表中添加了一些信息: 现在我想将图书列表转换为以下形式的地图: 因此,输出(上面的地图)如下所示: 因此,我需要按isbn作为关键字和作者作为值对条目进行分组。一个isbn可以有多个作者。 我尝试如下: 不能更改bean的格式。如果bean有字符串值而不是map,我可以这样做,但是要坚持使用map。 我已经写了传统的java 6/7方式来正确地做这件

  • 我正在开发和spring应用程序,对于对象映射,我使用ModelMapper库。 我能够映射基本类映射,但当我尝试映射2个集合元素时,源是一组枚举,具有其他属性,如名称和描述,目标是具有id、名称和描述的pojo。 我已经尝试了类型地图和转换器在映射配置文件,但我得到例外的映射器。 源类来自其他应用程序(其依赖项已在pom.xml中添加)。我也不希望源类型作为目标setter中的参数。 前。 资料

  • 假设我有以下映射目标。 如何从其他属性的Iterable映射到其他属性? 我可以这样做吗?

  • 问题内容: 我正在使用MapStruct库映射对象,但出现此错误: 无法将属性“ java.util.Date aDate”映射到“ javax.xml.bind.JAXBElement ADATE”。考虑声明/实现一个映射方法:“ javax.xml.bind.JAXBElement map(java.util.Date value)”。 我的问题:应该在哪里取消此映射方法? 问题答案: 我通过