gpt4 book ai didi

java - 使用 Java 中的 Streams/Lambda 将 Stream> 转换为 T[][]

转载 作者:搜寻专家 更新时间:2023-11-01 02:19:29 27 4
gpt4 key购买 nike

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

我的方法签名是:

public <T> T[][] createArrays(Class<T> clazz, T...items)

我正在使用具有签名的静态方法:

public static <T> Stream<Stream<T>> of(T...items)

并计算传递数组的所有排列。

我的解决方案是:

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;
}

我尝试了 .map(s -> s.toArray(....)) 但无法使 T[] cast 正常工作,IntFunction 生成器无法正常工作,也无法使用 Array.newInstance 正常工作。我可能遗漏了一些东西,非常感谢任何建议。

保重并提前感谢您抽出时间!!

最佳答案

您可以像这样使用 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));
}

没有任何中间 List

有一个变体可以创建相同类型的数组而无需未经检查的转换,就像这样

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));
}

但由于不存在 T[][] 类型的现有数组,我们无法避免使用 Array.newInstance 创建外部数组。但请注意,它不需要 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));
}

关于java - 使用 Java 中的 Streams/Lambda 将 Stream<Stream<T>> 转换为 T[][],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52331976/

27 4 0