Java初始化List-一行代码初始化ArrayList

Java代码中,初始化List时常见操作,如何用最少的代码初始化ArrayList并赋值?

基础版

如果需要初始化一个List,最快想到的办法:

ArrayList<String> name = new ArrayList<String>();
name.add("Angla");
name.add("Bob");
name.add("Cris");

扩展版

使用Arrays来创建一个 list,然后在使用ArryList来初始化:

ArrayList<String> name = new ArrayList<String>(
    Arrays.asList("Angla", "Bob", "Cris"));

代码简化了不少,和基础版效果一样,不过使用Arrays额外来带了一定的开销。

匿名内部类

采用匿名内部类初始化ArrayList,减少了一丁点代码,但是理解起来困难了些。

ArrayList<String> list = new ArrayList<String>() {{
    add("Angla");
    add("Bob");
    add("Cris");
}};

虽然少了一点点代码,但是内部类需要慎用:Java编译器会把所有的类,包括内部类都会单独生成.class文件,加载这些‘多余的类’,类加载器可有的忙了。

初始化成List

Arrays可以简单地创建list,但是不能成为ArrayList

List<String> name = Arrays.asList("Angla", "Bob", "Cris");

代码虽然简单,但是这个List可不是你以为的那个List,该List是不可变集合,生成的list不能增加或删除元素。因为Arrays工具类中实现了自己的ArrayList,但是只实现了部分关键的方法。

一个元素的List

如果只有一个元素,可以使用下面的方式初始化:

List<String> name = Collections.singletonList("Buenos");

Collections类中实现了SingletonList,它没有实现全部的方法,生成List是不可变集合,生成的list不能增加或删除元素(会出现UnsupportedOperationException异常)。

Java 8

Java 8 引入的streamAPI,可以使用下面的方式初始化List:

List<String> strings = Stream.of("Angla", "Bob", "Cris").collect(toList());

虽然显得长了些,但实际上,可以用下面的方式:

Stream<String> strings = Stream.of("Angla", "Bob", "Cris");

毕竟,用stream可以做List能做的任何事情。

Java 9

Java 9 扩充了List,可以使用下面的方式来初始化List:

List<String> name = List.of("Angla", "Bob", "Cris");

该List是不可变集合,生成的list不能增加或删除元素。

Java 10

Java 10 的类型推断,可以简化代码:

var name = List.of("Angla", "Bob", "Cris");

该List是不可变集合,生成的list不能增加或删除元素。

Guava

如果项目中引入了 Guava包,可以采用下面的方式:

ArrayList<String> name = Lists.newArrayList("Angla", "Bob", "Cris");

一行代码,可变集合ArrayList,满足所有需求。缺点就是要多加一个外部依赖。

标签: