转换流<;溪流<;T>&燃气轮机;通过流/λ';Java中的s
我想看看是否有更好的方法来解决我不得不使用这些签名的困境(注意:由于Spock测试,需要T[][],我提供T[]]作为数据提供者) 我的方法签名是:转换流<;溪流<;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(
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));
}