Estoy buscando para ver si había una mejor manera de resolver mi dilema de tener que utilizar estas firmas (nota: la T [] [] es necesaria debido a las pruebas Spock y yo estoy proporcionando T [] [] como proveedor de datos)
Mi firma del método es:
public <T> T[][] createArrays(Class<T> clazz, T...items)
Estoy utilizando un método estático que tiene la firma:
public static <T> Stream<Stream<T>> of(T...items)
y calcula todas las permutaciones de la matriz pasada.
Mi solución, volver a teclear manualmente para perdonar los errores tipográficos, es:
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;
}
Me trató .map (s -> s.toArray (....)) pero no pudo conseguir T [] elenco de trabajo, el generador IntFunction al trabajo, ni utilizar el Array.newInstance de trabajo. Me estoy perdiendo algo probable y agradecería mucho cualquier sugerencia.
Cuidar y gracias por su tiempo de antelación !!
Se puede utilizar Array.newInstance
la siguiente manera:
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));
}
sin ningún intermedios List
s.
Existe una variante para crear matrices del mismo tipo sin moldes sin marcar, como este
public static <T> T[][] createArrays(Class<T> clazz, T... items) {
Stream<Stream<T>> streams = EnumPerm.of(items);
T[] template = Arrays.copyOf(items, 0);
return streams
.map(s -> s.toArray(len -> Arrays.copyOf(template, len)))
.toArray(len -> (T[][])Array.newInstance(template.getClass(), len));
}
pero puesto que no hay matriz existente de tipo T[][]
, no podemos evitar Array.newInstance
para la creación de la matriz externa. Pero tenga en cuenta que es no necesita el clazz
parámetro.
Si desea aplicar el uso de la especificada clazz
parámetro para todas las matrices, puede utilizar
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));
}