7

我有下面的代码片段来添加元素ArrayList

List <Integer> myList = new  ArrayList();
myList.add(1);
myList.add(2);
myList.add(3);
myList.add(4);

我正在寻找更具可读性和优雅的方式来添加元素ArrayList,如下所示。我知道下面是不允许的,但还有其他可读/优雅的方式吗?

myList.add(1).add(2).add(3).add(4)

更新:-我在 java 1.6

4

8 回答 8

15

当您在实例化之前知道元素时:

List<Integer> myList = new ArrayList<>(Arrays.asList(1, 2, 3, 4));

或者如果您想将它们添加到现有列表中:

List<Integer> myList = new ArrayList<>();
// do stuff
myList.addAll(Arrays.asList(1, 2, 3, 4));

为了使其更具可读性,您可以

import static java.util.Arrays.asList;

并简单地使用

List<Integer> myList = new ArrayList<>(asList(1, 2, 3, 4));

或者

List<Integer> myList = new ArrayList<>();
// do stuff
myList.addAll(asList(1, 2, 3, 4));

如果您知道您永远不想向列表中添加更多元素,您可以简单地编写

List<Integer> myList = Arrays.asList(1, 2, 3, 4);

或使用静态导入:

List<Integer> myList = asList(1, 2, 3, 4);
于 2013-05-14T09:43:21.943 回答
5

番石榴方式(虽然 List 是不可变的):

ImmutableList<Integer> myList = ImmutableList.<Integer>builder()
                             .add(1)
                             .add(2)
                             .add(3)
                             .build();

或者这样:

List <Integer> myList = Lists.newArrayList(1,2,3);

或者

List <Integer> myList = Ints.asList(1,2,3);
于 2013-05-14T09:48:56.983 回答
3

如果你觉得这个可读,这里还有另一种方法

List<Integer> list = new ArrayList<Integer>() {{
    add(1);add(2);add(3);
}};
于 2013-05-14T09:46:19.083 回答
2

您可以通过扩展来链接方法ArrayList..然后添加一个addMe返回新ArrayList类的方法

class chainedArrayList extends ArrayList
{
     public chainedArrayList addMe(Object o)
     {add(o);return this;}
}

您现在可以链接方法

mychainedArrayList.addMe(1).addMe(2).addMe(3).addMe(4);
于 2013-05-14T09:48:47.133 回答
1

使用Eclipse Collections,如果您想要一个可变的整数列表,可以使用以下内容:

MutableList<Integer> list1 = Lists.mutable.with(1).with(2).with(3).with(4);
MutableList<Integer> list2 = Lists.mutable.with(1, 2, 3, 4);
Assert.assertEquals(list1, list2);

如果您想要一个可变的 int 列表,而不需要装箱,您可以使用以下内容:

MutableIntList primitiveList1 = IntLists.mutable.with(1).with(2).with(3).with(4);
MutableIntList primitiveList2 = IntLists.mutable.with(1, 2, 3, 4);
Assert.assertEquals(primitiveList1, primitiveList2);

注意:我是 Eclipse Collections 的提交者。

于 2013-05-15T18:58:38.710 回答
0

这是一种方式。但我猜这个值并不总是 1...4。你仍然可以使用 for 循环。

for (int i = 1; i <= 4; i ++){
mylistAdd(i)  
}
于 2013-05-14T09:46:48.027 回答
0

不遗憾,因为它返回布尔值,除非您扩展它,否则您可以按照构建器的样式进行操作。

看看番石榴(谷歌收藏)是否有适合你的东西。他们使用可能适合或不适合您的构建器样式。喜欢..

public static <E> List<E> asList(@Nullable 
             E first,
             E[] rest)

如果您想要 Java 中的缩短版本,也可以考虑使用groovy

def list = [5, 6, 7, 8]

但老实说,做一个 for 循环和一个 add 就足够优雅了,还有更多的事情需要担心。

于 2013-05-14T09:56:30.180 回答
0

如上所述,要走的路是 Arrays.asList(T...) 。但这是另一种方法:

public class CollectionChain<T, C extends Collection<T>> {

    public static <T> CollectionChain<T, ArrayList<T>> newArrayList(T inital) {
        return start(new ArrayList<>(), inital);
    }

    public static <T, C extends Collection<T>> CollectionChain<T, C> start(C collection, T inital) {
        return new CollectionChain<>(collection).add(inital);
    }

    private final C collection;

    private CollectionChain(C collection) {
        this.collection = collection;
    }

    public CollectionChain<T, C> add(T value) {
        collection.add(value);
        return this;
    }

    public final CollectionChain<T, C> addAll(T... values) {
        return addAll(Arrays.asList(values));
    }

    public CollectionChain<T, C> addAll(Collection<T> values) {
        collection.addAll(values);
        return this;
    }

    // Add other chained actions

    public C get() {
        return collection;
    }
}

可以这样使用:

import static project.path.CollectionChain.*;

List<String> chainResult = newArrayList("Needed to properly resolve the type").add("A test").addAll("1", "2").get();

这样,只会创建和填充一个列表。

于 2019-11-16T16:14:12.533 回答