Java语言Iterator转换成 List的方法

 更新时间:2023年08月05日 09:36:15   作者:明月一壶酒  
在 Java 中,迭代器(Iterator)是一种用于遍历集合中元素的对象,它提供了一种简单而一致的方式来访问集合中的元素,而不需要暴露集合内部的结构,这篇文章主要介绍了Java语言Iterator转换成 List的方法,需要的朋友可以参考下

迭代器如何逆向转换成List集合

在 Java 中,迭代器(Iterator)是一种用于遍历集合中元素的对象,它提供了一种简单而一致的方式来访问集合中的元素,而不需要暴露集合内部的结构。如果我们需要将一个迭代器逆向转换成 List 集合,可以使用 ListIterator 接口来实现。

ListIterator 接口是 Iterator 接口的子接口,它提供了一些额外的方法,例如 hasPrevious()、previous()、add()、set() 和 remove() 等,可以在迭代器中添加、修改或删除元素,并且支持逆向遍历。下面是将迭代器逆向转换成 List 集合的示例代码:

// 假设已经存在一个迭代器对象 iterator,可以通过以下代码将其逆向转换为 List 集合
List<Object> list = new ArrayList<>();
ListIterator<Object> listIterator = list.listIterator(list.size());
while (iterator.hasPrevious()) {
    Object element = iterator.previous();
    listIterator.add(element);
}

在这个示例中,我们先创建了一个空的 ArrayList 对象,并使用 listIterator() 方法获取 ListIterator 对象。该方法的参数是一个整数,表示从指定的位置开始遍历 List 集合(在这里,我们将其设置为 List 集合的末尾)。然后,我们使用 while 循环遍历迭代器对象中的元素,并将每个元素添加到 ListIterator 对象中。由于 ListIterator 对象支持在任意位置添加元素,因此我们可以将迭代器中的元素逆序添加到 List 集合中。

最终,我们得到了一个包含逆序迭代器中所有元素的 List 集合。需要注意的是,这种转换方式只适用于那些实现了 List 接口的集合类,例如 ArrayList、LinkedList 等。对于其他类型的集合类,可能需要先将其转换为 List 集合,再使用上述代码进行转换。

拓展

StreamSupport

StreamSupport 是 Java 8 中提供的一个工具类,它提供了一些静态方法,用于将传统的迭代器(Iterator)和 Spliterator 转换为 Java 8 中的 Stream 流。该工具类可以在对传统集合进行操作时,方便地使用 Java 8 的 Stream API 进行处理。

StreamSupport 中最常用的方法是 stream() 方法,该方法接受一个 Spliterator 对象和一个布尔值参数,用于指定是否开启 Stream 并行处理模式。以下是 stream() 方法的方法签名:

public static <T> Stream<T> stream(Spliterator<T> spliterator, boolean parallel)

在该方法中,T 表示元素的类型,spliterator 表示要转换为 Stream 的 Spliterator 对象,parallel 表示是否开启并行处理模式。

除了 stream() 方法,StreamSupport 还提供了其它一些方法,例如:

  • stream(Iterator<T> iterator, boolean parallel):将传统的 Iterator 对象转换为 Stream。
  • stream(Spliterator<T> spliterator):将传统的 Spliterator 对象转换为 Stream。
  • stream(Iterable<T> iterable, boolean parallel):将传统的 Iterable 对象转换为 Stream。

需要注意的是,StreamSupport 工具类中的这些方法返回的是一个 Stream 流,因此可以使用 Java 8 中提供的 Stream API 进行各种操作,例如:过滤、映射、分组、聚合等。

Spliterator

Spliterator(分离器)是 Java 8 中引入的一个新接口,它是 Iterator 接口的扩展,用于支持并行遍历数据流。Spliterator 可以将数据流分割成多个部分,每个部分可以在不同线程中进行处理,从而实现数据流的并行处理。

Spliterator 接口提供了一些方法,用于支持数据流的分割、遍历以及并行处理:

  • tryAdvance(Consumer<? super T> action):尝试遍历下一个元素,并将其传递给指定的 Consumer。
  • forEachRemaining(Consumer<? super T> action):遍历剩余的所有元素,并将它们传递给指定的 Consumer。
  • trySplit():尝试将数据流分成两个部分,返回一个 Spliterator 对象,表示分离后的数据流。
  • estimateSize():估计剩余未遍历的元素个数。
  • characteristics():返回 Spliterator 的特性集合。

在使用 Spliterator 进行并行处理时,通常需要遵循一些规则,例如:

  • 数据流必须是无序的,并且不能保证每个元素都会被遍历且仅被遍历一次。
  • 分割后的子 Spliterator 应该足够小,以便于在不同线程中进行处理。通常建议将子 Spliterator 的大小设置为原始数据流大小的 1/2 或 1/4。
  • Spliterator 的特性应该明确,以便于在并行处理时进行优化。例如,如果数据流是有序的,则应该使用 ORDERED 标志;如果数据流不可变,则可以使用 IMMUTABLE 标志等。

总的来说,Spliterator 提供了一种方便的方式来支持并行处理数据流,并且可以根据实际情况进行灵活的优化和调整。

JAVA中Iterator转List三种方法

使用com.google.common.collect.Lists(推荐)使用org.apache.commons.collections.IteratorUtils(垃圾)遍历iterator并add进list(不够优雅)

使用com.google.common.collect.Lists

用法:

import com.google.common.collect.Lists;
Iterator<Element> myIterator = elementDao.findAll();
List<Element> myList = Lists.newArrayList(myIterator);

源码:

可以看到这里用了泛型,使得输出类型确定

  public static <E> ArrayList<E> newArrayList(Iterator<? extends E> elements) {
    ArrayList<E> list = newArrayList();
    Iterators.addAll(list, elements);
    return list;
  }

使用org.apache.commons.collections.IteratorUtils

用法:

import org.apache.commons.collections.IteratorUtils;
Iterator<Element> myIterator = elementDao.findAll();
List myList=IteratorUtils.toList(myIterator); 

源码:

可以看到这里返回的是List类型,用时需要先判断类型,再强制转换

public static List toList(Iterator iterator) {
        return toList(iterator, 10);
    }

遍历iterator并add进list

用法:遍历的方法很多,可以用while等等

Iterator<Element> myIterator = elementDao.findAll();
List<Element> actualList = new ArrayList<Element>();
while (iterator.hasNext()) {
    actualList.add(iterator.next());
}

本文参考:

JAVA Iterator 转成list

Iterator转List的几种方法

到此这篇关于Java语言 Iterator 如何装换成 List的文章就介绍到这了,更多相关java Iterator转换成list内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现提取图片边缘的示例代码

    Java实现提取图片边缘的示例代码

    这篇文章主要为大家详细介绍了如何利用Java实现提取图片边缘的功能,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-06-06
  • Java集合继承体系详解

    Java集合继承体系详解

    这篇文章主要为大家详细介绍了Java集合继承体系,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • Java集合之Map接口的实现类精解

    Java集合之Map接口的实现类精解

    Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value;Map中的键值对以Entry类型的对象实例形式存在;键(key值)不可重复,value值可以重复,一个value值可以和很多key值形成对应关系,每个建最多只能映射到一个值
    2021-09-09
  • JAVA中常用的数据结构和XML使用解析

    JAVA中常用的数据结构和XML使用解析

    这篇文章主要介绍了JAVA中常用的数据结构和XML使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • java实现简单单链表

    java实现简单单链表

    这篇文章主要为大家详细介绍了java实现简单单链表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-02-02
  • SpringBoot中防止接口重复提交的有效方法

    SpringBoot中防止接口重复提交的有效方法

    在Web应用开发过程中,接口重复提交问题一直是一个需要重点关注和解决的难题,本文将从SpringBoot应用的角度出发,探讨在单机环境和分布式环境下如何有效防止接口重复提交,希望通过本文的介绍,读者能够掌握在SpringBoot应用中防止接口重复提交的有效方法
    2024-05-05
  • Java使用Apache Commons高效处理CSV文件的操作指南

    Java使用Apache Commons高效处理CSV文件的操作指南

    在 Java 开发中,CSV(Comma-Separated Values,逗号分隔值)是一种常见的数据存储格式,广泛用于数据交换和简单的存储任务,本文将介绍Java使用Apache Commons高效处理CSV文件的操作指南,需要的朋友可以参考下
    2025-03-03
  • springMVC在restful风格的性能优化方案

    springMVC在restful风格的性能优化方案

    这篇文章主要介绍了springMVC在restful风格的性能优化方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java基于fork/koin类实现并发排序

    Java基于fork/koin类实现并发排序

    这篇文章主要介绍了Java基于fork/koin类实现并发排序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 基于IDEA,Eclipse搭建Spring Boot项目过程图解

    基于IDEA,Eclipse搭建Spring Boot项目过程图解

    这篇文章主要介绍了基于IDEA,Eclipse搭建Spring Boot项目过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04

最新评论