Convertir la corriente <Corriente <T >> a T [] [] con corrientes / Lambda en Java

JavaJd:

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 !!

Holger:

Se puede utilizar Array.newInstancela 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 Lists.

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.newInstancepara la creación de la matriz externa. Pero tenga en cuenta que es no necesita el clazzparámetro.

Si desea aplicar el uso de la especificada clazzpará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));
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=188018&siteId=1
Recomendado
Clasificación