Я придумал решение ниже, не уверен, что Type: предупреждения безопасности можно удалить, используя что-то еще.
BiFunction<List<List<T>>, Class<T>,T[][]> toArray = (list,type) ->
{
T a[][] = (T[][]) Array.newInstance(type,
list.size(), list.get(0).size());
IntStream.range(0, a.length)
.forEach(i -> {
a[i]=(T[]) list.get(i).toArray();
});
return a;
};
Кроме того, если бы это можно было улучшить с помощью одного конвейера, я был бы признателен за решение.
извините, но я не понимаю, что именно вы хотите сделать? преобразовать List<List<T>>
в T[][]
Я получаю предупреждения при первом задании, также я хотел бы сказать, что мне пришлось переписать метод, когда я тестировал его на матрице Integer, поэтому теперь я использую ниже BiFunction<List<List<T>>, Class<T>,T[][]> toArray = (list,type) -> { T a[][] = (T[][]) Array.newInstance(list.get(0).get(0).getClass(), list.size(), list.get(0).size()); IntStream.range(0, list.size()) .forEach(i -> { IntStream.range(0, list.get(0).size()) .forEach(j -> { a[i][j]=list.get(i).get(j); }); }); return a; };
YCF_L да, это то, что я ищу, к вашему сведению, код работает, но мне нужен более элегантный способ сделать это с использованием потоков и карт, и мне не нужно использовать оператор forEach, который нельзя запускать в параллельном потоке.
У меня есть два предложения: в обоих случаях преобразовать список из списка в список, повторяющий список списка, и добавить каждый элемент как T[] в новый список.
Используйте Array.newInstance только для создания вспомогательных объектов и добавьте аннотацию @SuppressWarnings.
@SuppressWarnings("unchecked")
public static <T> T[][] toArray(List<List<T>> list, Class<T> type) {
T aux[] = (T[]) Array.newInstance(type, 0);
T auxBi[][] = (T[][]) Array.newInstance(type, 0, 0);
List<T[]> newList = new ArrayList<>();
list.forEach(e -> newList.add(e.toArray(aux)));
T[][] newBi = newList.toArray(auxBi);
return newBi;
}
или
добавить auxliars в качестве параметров вместо тип
public static <T> T[][] toArray(List<List<T>> list, T aux[], T auxBi[][]) {
List<T[]> newList = new ArrayList<>();
list.forEach(e -> newList.add(e.toArray(aux)));
T[][] newBi = newList.toArray(auxBi);
return newBi;
}
Ценю этот ответ, это дало мне представление о том, чего я хотел достичь.
Решение выше с использованием потокового конвейера public BiFunction<List<List<T>>,Class<T>, T[][]> toArr = (list,type)-> list.stream().map(row -> row.toArray((T[]) Array.newInstance(type, 0))).collect(Collectors.toList()).toArray((T[][]) Array.newInstance(type, 0, 0));
List.toArray()
без аргумента всегда будет возвращатьсяObject[]
- вам также нужно будет создать соответствующие экземпляры для компонентов, а не только для большего массива. Откуда вы берете предупреждения?