轻松将元素添加到varargs列表

时间:2019-03-02 23:27:37

标签: java

我有以下签名:

  public static <T, E> AsyncTask<List<T>, E> Parallel(AsyncTask<T,E> t, AsyncTask<T, E>... tasks) {
    return cb -> NeoParallel.Parallel(List.of(tasks), cb);
  }

  public static <T, E> AsyncTask<List<T>, E> Series(AsyncTask<T,E> t, AsyncTask<T, E>... tasks) {
    return cb -> NeoSeries.Series(List.of(tasks), cb);
  }

如何轻松地将t添加到List.of(tasks)

这将不起作用,因为它创建了一个不可变的列表:

var listOfTasks = Arrays.asList(tasks);
listOfTasks.add(0, t);

有没有一种方法可以轻松地创建我可以添加到列表中的列表,或者可以一行完成?

由于此呼叫可能无法正常运行,

   listOfTasks.add(0, t);

我正在寻找替代品

3 个答案:

答案 0 :(得分:1)

没有简洁的方法来创建列表。也许最好的选择是创建一个新列表,将数组元素和新元素都添加到列表中,并使用Collections.unmodifiableList返回一个不可修改的列表。

    List<T> newList = new ArrayList<>(tasks.length + 1);
    newList.addAll(Arrays.asList(tasks));
    newList.add(t);
    List<T> unmodifiableList = Collections.unmodifiableList(newList);

答案 1 :(得分:1)

在当前的Java dump_tree()不可能实现短而高性能的解决方案(也许这一点都不好!),我将在{{1 }}。

API

此行

Stream

展开后变为

return cb -> NeoSeries.Series(concat(of(t), of(tasks)).collect(toList()), cb);

这是延迟计算的,将避免出现临时状态。


另一个答案未能提及的是空处理。如果varargs数组为null怎么办? concat(of(t), of(tasks)).collect(toList()) 将引发Stream.concat(Stream.of(t), Stream.of(tasks)) .collect(Collectors.toList()); Arrays.asList

也是一样

为此,您可以编写掩蔽方法,例如

Exception

并像使用它

Stream.of

答案 2 :(得分:0)

这就是我得到的:

之前:

var tasks = Arrays.asList(args);
tasks.add(0,t);  // throws exception 

之后:

var newList = new ArrayList<>(Arrays.asList(args));
newList.add(0,t);

第一个问题是它创建了一个不可变列表,如果您在首次创建后尝试添加到列表中,则会抛出异常。