我有以下签名:
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);
我正在寻找替代品
答案 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);
第一个问题是它创建了一个不可变列表,如果您在首次创建后尝试添加到列表中,则会抛出异常。