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

分组对象Java 8

许博易
2023-03-14
问题内容

我有类似以下内容:

public class MyClass {
private Long stackId
private Long questionId
}

例如100的集合,其中stackid可以使用不同的questionId复制。stackId和questionId之间的一对多关系

是否有一种 流式的 Java 8方式可以转换为以下结构:

public class MyOtherClass {
private Long stackId
private Collection<Long> questionIds
}

这将是25个的集合,每个实例具有4个QuestionId的嵌套集合

输入:

[{1,100},{1,101},{1,102},{1,103},{2,200},{2,201},{2,202},{1,203}]

输出量

[{1, [100,101,102,103]},{2,[200,201,202,203]}]

问题答案:

Stream API的直接方法涉及2条Stream管道:

  • 第一个创建一个临时Map<Long, List<Long>>stackIdquestionIds。这是通过groupingBy(classifier, downstream)收集器完成的,在收集器中我们根据对进行分类,stackId并将具有相同值的值stackId映射到它们的questionId(和mapping),并使用收集到列表中toList()
  • 第二个将该映射的每个条目转换为一个MyOtherClass实例,并将其收集到一个列表中。

假设您有一个构造函数MyOtherClass(Long stackId, Collection<Long> questionIds),示例代码将是:

Map<Long, List<Long>> map = 
    list.stream()
        .collect(Collectors.groupingBy(
            MyClass::getStackId,
            Collectors.mapping(MyClass::getQuestionId, Collectors.toList())
        ));

List<MyOtherClass> result = 
    map.entrySet()
       .stream()
       .map(e -> new MyOtherClass(e.getKey(), e.getValue()))
       .collect(Collectors.toList());

使用StreamEx库,您可以在单个Stream管道中执行此操作。该库提供了pairingfirst收集器。这样可以配对两个收集器,并对两个收集的结果执行整理器操作:

  • 第一个仅保留stackId分组元素中的第一个(根据构造,它们将全部相同)
  • 第二个将每个元素映射到它们questionId并收集到一个列表中。
  • 整理程序操作仅返回的新实例MyOtherClass

样例代码:

import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.mapping;
import static java.util.stream.Collectors.toList;
import static one.util.streamex.MoreCollectors.first;
import static one.util.streamex.MoreCollectors.pairing;

// ...

Collection<MyOtherClass> result = 
    StreamEx.of(list)
            .groupingBy(
                MyClass::getStackId,
                pairing(
                    collectingAndThen(mapping(MyClass::getStackId, first()), Optional::get),
                    mapping(MyClass::getQuestionId, toList()),
                    MyOtherClass::new
                )
            ).values();


 类似资料:
  • 我的数组是这样的: 我想把这个转换成: 所以,基本上,按分组。 我正在尝试: 我只是不知道如何处理相似组值的分组。

  • 我正在做一个项目,我正在与返回JSON响应的第三方服务集成。我正在使用Jackson将响应反序列化为JavaPOJO。响应是一个对象,它有几个Jackson能够轻松解析的简单字段。但是响应还包含一个带有单个条目的数组,该条目也是一个对象。当Jackson尝试反序列化它时,我得到了包含列表中单个条目的顶级对象,但是列表中单个条目的所有字段都是空的。知道我在这里做错了什么吗? 更新:将FAIL\u O

  • 我有一个关于KML中的组的问题。 我有一个数据集,由50个对象组成。这些对象具有属性,即F.E严重性。有没有可能根据这些严重性类对我的KML文档进行分类?(1/1.5/2)还是基于任何其他属性?我已经手动创建了文件夹,但数据集越大,工作量就越大...我也想为对象着色,基于分类。附上我将添加我的文档。也许有人知道如何处理这件事?

  • 问题内容: 我的数组是这样的: 我想将其转换为: 因此,基本上,分组依据。 我尝试着: 我只是不知道如何处理相似组值的分组。 问题答案: 首先,在JavaScript中,使用遍历数组通常不是一个好主意。 因此,您可以尝试执行以下操作: 在这里使用中间对象有助于加快处理速度,因为它可以避免嵌套循环搜索数组。另外,因为使用迭代遍历对象(而不是数组)是合适的。 附录 FWIW,如果要避免在结果数组中出现

  • 有人知道一种方法(如果可能的话也可以使用lodash)通过对象键对对象数组进行分组,然后根据分组创建新的对象数组吗?例如,我有一个汽车对象数组: 我想制作一个由分组的新汽车对象数组:

  • 问题内容: 问题在于确定以下符号之间的权衡: 基于JSON : 基于数组 : 关于同一问题的这篇文章,我已经决定(在前端)使用JSON对象表示法而不是对象数组,因为它符合我的要求,更好的性能和更少的浏览器代码。 但是问题在于列表本身不是静态的。我的意思是,该列表正在生成,即从DB(NoSQL)获取/存储,并通过服务器上的JavaAPI为新条目创建。我无法决定在后端应使用哪种表示法(最终也会影响UI