转换流<;溪流<;T>&燃气轮机;通过流/λ';Java中的s

转换流<;溪流<;T>&燃气轮机;通过流/λ';Java中的s,java,arrays,list,java-8,java-stream,Java,Arrays,List,Java 8,Java Stream,我想看看是否有更好的方法来解决我不得不使用这些签名的困境(注意:由于Spock测试,需要T[][],我提供T[]]作为数据提供者) 我的方法签名是: public <T> T[][] createArrays(Class<T> clazz, T...items) public T[][]创建数组(类clazz,T…项) 我使用的是一个静态方法,其签名为: public static <T> Stream<Stream<T>> of(

我想看看是否有更好的方法来解决我不得不使用这些签名的困境(注意:由于Spock测试,需要T[][],我提供T[]]作为数据提供者)

我的方法签名是:

public <T> T[][] createArrays(Class<T> clazz, T...items)
public T[][]创建数组(类clazz,T…项)
我使用的是一个静态方法,其签名为:

public static <T> Stream<Stream<T>> of(T...items)
公共静态流(T…项)
并计算所传递数组的所有置换

我的解决方案是手动重新键入,以避免拼写错误:

public static <T> T[][] createArrays(Class<T> clazz, T...items){
  Stream<Stream<T>> streams = EnumPerm.of(items);
  List<List<T>> lists = streams.map(s -> ).collect(toList()).collect(toList());
  T[][] outer = (T[][])(Array.newInstance(clazz,lists.size(),items.length);
  for(int x=0;x<lists.size();x++){
    List<T> innerList = lists.get(x);
    for(int y=0;y<items.length;y++){
      outer[x][y] = innerList.get(x);
    }      
  }

  return outer;
}
publicstatict[]createarray(类clazz,T…项){
Stream streams=枚举(项);
List List=streams.map(s->).collect(toList()).collect(toList());
T[][]外部=(T[][])(Array.newInstance(clazz,lists.size(),items.length);

对于(int x=0;x您可以像这样使用
Array.newInstance

public static <T> T[][] createArrays(Class<T> clazz, T... items) {
    Stream<Stream<T>> streams = EnumPerm.of(items);
    return streams
        .map(s -> s.toArray(len -> (T[])Array.newInstance(clazz, len)))
        .toArray(len -> (T[][])Array.newInstance(items.getClass(), len));
}
但是由于没有类型为
T[][]
的现有数组,我们无法避免创建外部数组时使用
array.newInstance
。但是请注意,is不需要
clazz
参数

如果要对所有数组强制使用指定的
clazz
参数,可以使用

public static <T> T[][] createArrays(Class<T> clazz, T... items) {
    Stream<Stream<T>> streams = EnumPerm.of(items);
    return streams
        .map(s -> s.toArray(len -> (T[])Array.newInstance(clazz, len)))
        .toArray(len -> (T[][])Array.newInstance(clazz, len, 0));
}
publicstatict[]createarray(类clazz,T…项){
Stream streams=枚举(项);
回流
.map(s->s.toArray(len->(T[])数组.newInstance(clazz,len)))
.toArray(len->(T[][])Array.newInstance(clazz,len,0));
}

如果您对未检查的强制类型转换没有问题,请尝试使用
T[][]列表=(T[]])streams.map(x->(T[])x.toArray()).toArray()
谢谢你的回复清理程序,我确实尝试过,但我遇到了一个问题,因为无法识别“T”的类型擦除。像一个迷人的霍尔格一样工作,打字等等!@Shadov,接受了这个答案,因为没有抛出异常。我从来没有想过要使用这样的模板,这是一个非常漂亮的把戏,我将保存起来以备将来使用!!!tyvm!!!
public static <T> T[][] createArrays(Class<T> clazz, T... items) {
    Stream<Stream<T>> streams = EnumPerm.of(items);
    return streams
        .map(s -> s.toArray(len -> (T[])Array.newInstance(clazz, len)))
        .toArray(len -> (T[][])Array.newInstance(clazz, len, 0));
}