Java中List与数组之间的相互转换

 更新时间:2023年05月23日 11:09:00   作者:开发小鸽  
在日常Java学习或项目开发中,经常会遇到需要int[]数组和List列表相互转换的场景,然而往往一时难以想到有哪些方法,最后可能会使用暴力逐个转换法,往往不是我们所满意的,下面这篇文章主要给大家介绍了关于Java中List与数组之间的相互转换,需要的朋友可以参考下

一、前言

在Java编码中,我们经常会遇到List与数组的转换,包括对象List与对象数组的转换,以及对象List与基本数据类型数组的转换,下面详细介绍多种转换方式。

二、List列表与对象数组

List列表中存储对象,如List<Integer>List<String>List<Person>,对象数组中同样存储相应的对象,如Integer[]、String[]、Person[],对象数组与对象List的转换可通过如下方式实现:

(一)对象List转对象数组

1、toArray()方法

直接调用对象List的toArray()方法转换为对象数组,该方法的参数是T[],因此需要传入对应的对象数组构造函数,指定数组的长度,如下所示:

ArrayList<Integer> integersList = new ArrayList<>(Arrays.asList(1,2,3)); 
// 1、toArray()方法
Integer[] integersArrau = integersList.toArray(new Integer[integersList.size()]);

2、Stream流的toArray()方法

通过Stream流的toArray()方法,传入参数是对应对象的构造方法的方法引用,使用方式如下所示:

ArrayList<Integer> integersList = new ArrayList<>(Arrays.asList(1,2,3));
// 2、Stream流的toArray()方法
Integer[] integersArray2 = integersList.stream().toArray(Integer[]::new);

这个toArray()方法是Stream类下的,该方法说明如下所示:

/**
 * Returns an array containing the elements of this stream, using the
 * provided {@code generator} function to allocate the returned array, as
 * well as any additional arrays that might be required for a partitioned
 * execution or for resizing.
 *
 * <p>This is a <a href="package-summary.html#StreamOps" rel="external nofollow" >terminal
 * operation</a>.
 *
 * @apiNote
 * The generator function takes an integer, which is the size of the
 * desired array, and produces an array of the desired size.  This can be
 * concisely expressed with an array constructor reference:
 * <pre>{@code
 *     Person[] men = people.stream()
 *                          .filter(p -> p.getGender() == MALE)
 *                          .toArray(Person[]::new);
 * }</pre>
 *
 * @param <A> the element type of the resulting array
 * @param generator a function which produces a new array of the desired
 *                  type and the provided length
 * @return an array containing the elements in this stream
 * @throws ArrayStoreException if the runtime type of the array returned
 * from the array generator is not a supertype of the runtime type of every
 * element in this stream
 */
<A> A[] toArray(IntFunction<A[]> generator);

该方法传入一个函数式接口,该接口对应一个方法引用,作用是创建一个新的指定类型和长度的数组,因此我们传入的参数就是一个Integer[]数组的构造方法的方法引用,最终得到的也就是一个Integer[]数组。

3、for循环

过于简单,不再赘述。

(二)、对象数组转对象List

1、使用Arrays.asList()

该方法通过传入一个对象数组,最后转换为一个对象List,如下所示:

Integer[] integersArray = {1, 2, 3};
// 1、使用Arrays.asList()
List<Integer> integersList = Arrays.asList(integersArray);

asList方法传入的参数是一个可变参数,因此既可以传入多个参数,也可以传入一个数组,如下所示:

/**
 * Returns a fixed-size list backed by the specified array.  (Changes to
 * the returned list "write through" to the array.)  This method acts
 * as bridge between array-based and collection-based APIs, in
 * combination with {@link Collection#toArray}.  The returned list is
 * serializable and implements {@link RandomAccess}.
 *
 * <p>This method also provides a convenient way to create a fixed-size
 * list initialized to contain several elements:
 * <pre>
 *     List&lt;String&gt; stooges = Arrays.asList("Larry", "Moe", "Curly");
 * </pre>
 *
 * @param <T> the class of the objects in the array
 * @param a the array by which the list will be backed
 * @return a list view of the specified array
 */
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}

2、使用Collections.addAll()

通过Collections集合类的static方法将一个对象数组转换为对象List,注意首先要创建出一个对象List,使用方式如下所示:

Integer[] integersArray = {1, 2, 3};
// 2、使用Collections.addAll()
ArrayList<Integer> integersList2 = new ArrayList<>();
Collections.addAll(integersList2,integersArray);

3、使用Stream中的Collector

JDK8之后可以使用Stream流来执行转换操作,通过Stream流的终结操作collect来指定将要转换得到的List:

Integer[] integersArray = {1, 2, 3};
// 3、使用Stream中的Collector
List<Integer> integersList3 = Arrays.stream(integersArray).collect(Collectors.toList());

4、for循环

过于简单,不再赘述。

三、List列表与基本数据类型数组

上面我们介绍了对象List列表与对象数组之间的转换,但是有些情况需要直接将对象List转换为基本数据类型数组,如List<Integer>int[]这种情况,下面详细介绍。

(一)、对象List转基本数据类型数组

1、Stream流执行转换

通过Stream流执行转换,如List<Integer>转换为int[],通过Stream流的mapToInt()可将每个Integer转换为int,再输出为int数组,如下所示:

ArrayList<Integer> integersList = new ArrayList<>(Arrays.asList(1,2,3));
// 1、Stream流执行转换
// 方法引用
int[] arrays1 = integersList.stream().mapToInt(Integer::intValue).toArray();
// lambda表达式
int[] arrays2 = integersList.stream().mapToInt(i -> i).toArray();

2、for循环

过于简单,不再赘述。

(二)、基本数据类型数组转对象List

1、Stream流转换

以int[]数组来举例,通过Stream流的mapToObj()方法先将int[]数组中每个int值转换为Integer包装类,再通过collect执行终结操作转换为Integer的List。

int[] integersArray = {1, 2, 3};
// 1、Stream流转换
List<Integer> integersList = Arrays.stream(integersArray).mapToObj(Integer::new).collect(Collectors.toList());

2、for循环

for循环是最简单、好用的方式,不再赘述。

注意,二维数组中的 list.toArray(array) 方法不能用于一维的 int[] 中。

因为 toArray() 方法的参数是范型对象,而 int 是标准数据类型。可以用 Interger[]来实现

总结

到此这篇关于Java中List与数组之间的相互转换的文章就介绍到这了,更多相关Java List与数组相互转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Java的Struts框架中注释的用法

    详解Java的Struts框架中注释的用法

    这篇文章主要介绍了详解Java的Struts框架中注释的用法,Struts是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2015-12-12
  • hibernate一对多关联映射学习小结

    hibernate一对多关联映射学习小结

    这篇文章主要介绍了hibernate一对多关联映射学习小结,需要的朋友可以参考下
    2017-09-09
  • IDEA新建JAVA项目简单图文教程

    IDEA新建JAVA项目简单图文教程

    这篇文章主要给大家介绍了关于IDEA新建JAVA项目的相关资料,IDEA是现在java中最为常用的编译器,所以如何使用IDEA来创建java项目呢,这里给大家总结下,需要的朋友可以参考下
    2023-08-08
  • Java编程实现暴力破解WIFI密码的方法分析

    Java编程实现暴力破解WIFI密码的方法分析

    这篇文章主要介绍了Java编程实现暴力破解WIFI密码的方法,结合具体实例形式分析了java暴力破解WiFi密码的原理、操作步骤、实现技巧与相关注意事项,需要的朋友可以参考下
    2018-12-12
  • 阿里规范:为何boolean类型变量命名禁用is开头

    阿里规范:为何boolean类型变量命名禁用is开头

    这篇文章主要给大家介绍了关于阿里规范:为何boolean类型变量命名禁用is开头的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • MyBatis不同Mapper文件引用resultMap实例代码

    MyBatis不同Mapper文件引用resultMap实例代码

    这篇文章主要介绍了mybatis 不同Mapper文件引用resultMap的实例代码,非常不错具有参考借鉴价值,需要的朋友可以参考下
    2017-07-07
  • Spring Boot中使用MongoDB的连接池配置的方法

    Spring Boot中使用MongoDB的连接池配置的方法

    本文介绍了Spring Boot中使用MongoDB的连接池配置的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • maven配置多个仓库的实现

    maven配置多个仓库的实现

    本文主要介绍了maven配置多个仓库的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Java版微信公众号支付开发全过程

    Java版微信公众号支付开发全过程

    这篇文章主要介绍了Java版微信公众号支付开发全过程,本文通过实例相结合给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07
  • JAVA并发中VOLATILE关键字的神奇之处详解

    JAVA并发中VOLATILE关键字的神奇之处详解

    这篇文章主要给大家介绍了关于JAVA并发中VOLATILE关键字的神奇之处的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05

最新评论