代码之家  ›  专栏  ›  技术社区  ›  Alexander Mills

轻松地将元素添加到varargs列表

  •  1
  • Alexander Mills  · 技术社区  · 7 年前

    我有这些签名:

      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 回复  |  直到 7 年前
        1
  •  1
  •   David SN    7 年前

    没有简明的方法来创建列表。最好的选择可能是创建一个新列表,将数组元素和新元素都添加到列表中,然后使用 Collections.unmodifiableList .

        List<T> newList = new ArrayList<>(tasks.length + 1);
        newList.addAll(Arrays.asList(tasks));
        newList.add(t);
        List<T> unmodifiableList = Collections.unmodifiableList(newList);
    
        2
  •  1
  •   LppEdd    7 年前

    而短期&性能(也许这一点也不坏!)用当前的Java解决方案是不可能的 API ,我将在 Stream (s) 。

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

    这条线

    concat(of(t), of(tasks)).collect(toList())
    

    扩展成为

    Stream.concat(Stream.of(t), Stream.of(tasks))
          .collect(Collectors.toList());
    

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


    另一个答案没有提到的是空处理。如果varargs数组为空呢? Arrays.asList 会扔一个 Exception .我也是 Stream.of

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

    private static <T, E> AsyncTask<T, E>[] maskNull(final AsyncTask<T, E>[] tasks) {
        return tasks != null ? tasks : (AsyncTask<T, E>[]) new AsyncTask[0];
    }
    

    像这样使用它

    of(maskNull(tasks))
    
        3
  •  0
  •   Alexander Mills    7 年前

    下面是我得到的:

    之前:

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

    之后:

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

    第一个的问题是,它创建了一个不可变列表,如果在第一次创建之后尝试添加异常,它将抛出一个异常。