添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在本文中,我们将学习Java中的嵌套集合,以及如何使用不同的方法将它们转换为平面集合。

1.什么是展平?

在编程中,展平列表意味着合并多个嵌套列表以创建一个单一列表。展平的列表包含来自嵌套列表的所有元素。

嵌套List: [[4, 5, 2], [1, 34, 23], [12], [10, 11, 15]];
展平 List: [4, 5, 2, 1, 34, 23, 12, 10, 11, 15];

我们在每个解决方案中使用以下嵌套列表进行演示。

List<List<String>> nestedList = List.of(
      List.of("Alexandru", "John"),
      List.of("Emma","Andrew", "Luke"),
      List.of("Oliver"));

2. 使用自定义逻辑

最基本的解决方案之一是迭代嵌套列表,并将所有元素添加到新声明的平坦列表中。我们可以使用addAll()函数批量添加所有元素。

List<String> flatList = new ArrayList<>();
nestedList.forEach(flatList::addAll);

如果原始列表还包含单个元素,那么我们需要使用if-else条件来首先检查元素的类型。

List<String> flatList = new ArrayList<>();
for (Object item : nestedList) {
  if (item instanceof List<?>) {
      flatList.addAll(item)
  } else {
      flatList.add((String) item);

3. 使用流

Java Streams API为我们提供了一些有趣的方法,用于展平嵌套链表。

3.1. 使用flatMap()

我们可以使用flatMap()函数与映射函数Collection::stream

在执行流终端操作时,flatMap()的每个元素都提供一个单独的流。在最终阶段,flatMap()方法将所有流转换为新流。

List<String> flatList = nestedList.stream()
        .flatMap(Collection::stream)
        .collect(Collectors.toList());

3.2. 使用reduce()

减少是一种终端方法,用于聚合流。在reduce()方法中,我们向函数提供两个参数:第一个称为identity,即减少的默认值,第二个称为accumulator,用于组合两个值。

在我们的情况下,为了获得展平的列表,我们需要迭代Stream,并将连续的列表合并成每个后续嵌套列表的一个列表。请注意,由于在运行时创建了额外的ArrayList实例,这种方法不适用于大型嵌套列表的性能。

List<String> flatList = nestedList.stream()
        .reduce(new ArrayList<>(), (l1, l2) -> {
            l1.addAll(l2);
            return l1;

4. 使用Eclipse Collection

展平列表的另一种方法是使用Eclipse Collections的flatCollect()方法。Eclipse Collections是一个具有丰富API的与JDK兼容的List、Map和Set实现的Java集合框架。

将Eclipse Collection的最新版本添加到应用程序中。

<dependency>
    <groupId>org.eclipse.collections</groupId>
    <artifactId>eclipse-collections</artifactId>
    <version>11.1.0</version>
</dependency>

我们将使用ListAdapter类,它提供了一个围绕JDK Collections List接口实例的MutableList包装器,并将Java List转换为Eclipse Collection MutableList。然后,我们将使用它的flatCollect()方法来展平列表。

List<String> flatList = ListAdapter.adapt(nestedList).flatCollect(e -> e);

5. 使用Guava

Maven仓库添加Guava的最新版本。

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.1-jre</version>
</dependency>

Iterables.concat()方法非常适合从嵌套列表创建平坦列表。该方法将多个可迭代对象合并为单个可迭代对象。

Iterable<String> iterable = Iterables.concat(nestedList);
List<String> flatList = Lists.newArrayList(iterable);

6. 结论

展平嵌套列表在开始时可能会看起来很难,但实际上并不难。可以使用纯Java逻辑、流,甚至是外部集合库轻松完成这项任务。

版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/teach/9362.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
  • Java并发编程:集合的线程安全问题演示与解决
  • Java并发编程:线程间定制化通信
  • Java并发编程:线程间通信
  • Java并发编程:Lock接口
  • Java并发编程:JUC概述
  • Java多线程教程
  • Java多线程:ThreadPoolExecutor+BlockingQueue线程池示例详解
  • Java多线程:ScheduledExecutorService、ScheduledThreadPoolExecutor源码解读
  • Java多线程:ThreadPoolExecutor、RejectedExecutionHandler源码解读
  • Java多线程:AbstractExecutorService、CompletionService、ExecutorCompletionService源码解读
  • Java多线程:Executor、ExecutorService
  • Java多线程:Executors、ThreadFactory源码解读
  • Java开发工程师&培训讲师-中国江苏

    a-form ref校验表单提示Cannot read properties of undefined (reading ‘validate’)解决办法a-form ref校验表单提示Cannot read properties of undefined (reading ‘validate’)解决办法 2024-05-09 百度统计代码文章内页统计失效原因百度统计代码文章内页统计失效原因 2024-05-08 JDK8 升级到 JDK17 的需要注意的问题JDK8 升级到 JDK17 的需要注意的问题 2024-05-07 Java面试题:核心线程数为0时,线程池怎么执行?Java面试题:核心线程数为0时,线程池怎么执行? 2024-05-07 antdv表单切换中英文校验提示不跟着切换问题解决antdv表单切换中英文校验提示不跟着切换问题解决 2024-04-29 ThnBoV1.3.0插件美化WordPress文章缩略图免费下载ThnBoV1.3.0插件美化WordPress文章缩略图免费下载 2024-05-07 网站悬浮侧边栏在线客服代码免费下载网站悬浮侧边栏在线客服代码免费下载 2023-12-11 jQuery右侧悬浮栏扫二维码返回顶部代码免费下载jQuery右侧悬浮栏扫二维码返回顶部代码免费下载 2023-12-11 jQuery右侧悬浮在线客服返回顶部代码免费下载jQuery右侧悬浮在线客服返回顶部代码免费下载 2023-12-11 CSS3右侧悬浮工具栏返回顶部代码免费下载CSS3右侧悬浮工具栏返回顶部代码免费下载 2023-12-11 Java弱引用的理解与使用Java弱引用的理解与使用 2023-11-10 Ripro9.0日主题明文修复升级版下载,免扩展,虚拟主机可用Ripro9.0日主题明文修复升级版下载,免扩展,虚拟主机可用 2023-03-20 如何在Nginx中配置动静分离和反向代理如何在Nginx中配置动静分离和反向代理 2023-11-26 Java ArrayList add() – 添加单个元素到列表Java ArrayList add() – 添加单个元素到列表 2023-10-09 Java多线程:ThreadLocal详解Java多线程:ThreadLocal详解 2023-11-10
  • 版权声明

    本站的文章和资源无特殊说明均为站长
    原创,按照 CC BY -NC -SA 3.0 CN
    协议发布和共享,转载或引用本站文章
    应遵循相同协议。如果有侵犯版权的资
    源请尽快联系站长,我们会在24h内删
    除有争议的资源。
  • 本站目标

    我们的目标是:

    →Java学习更简单,培训不遇坑
    → Java毕设更容易,答辩一次过
    → Java面试更轻松,高薪工作更愉悦
  • 本站宗旨

    潘子夜个人博客,专注于
    Java学习
    Java培训、Java毕设、与Java面试题
    等方向的整理与分享,帮助同学们轻
    松学技术,顺利毕业,找到一个满意
    的工作。
  •