执行这段代码时:
final String testCases = MethodSourceParametrizedTesting.testCases()
.map(arg -> Arrays.stream(arg.get()).map(Object::toString).collect(joining(",")))
.collect(joining(";"));
出现以下错误:
java: cannot find symbol
symbol: method map((arg)->Arr[...]",")))
location: interface java.lang.String[][]
测试本身:
class MethodSourceParametrizedTesting {
Factorial factorial = new Factorial();
public static String[][] testCases() {
return new String[][]{
{"1","1"}, {"2", "2"}, {"5", "120"}};
}
@ParameterizedTest
@MethodSource("testCases")
void testFactorial(String in, String expected) {
assertEquals(expected, factorial.factorial(in));
}
}
错误 #1
他发誓你试图
map在 result 上立即调用方法。testCases()调用的结果是一个二维数组,它没有这样的方法。
你需要包装它
Arrays.stream()然后调用它。map()错误 #2
在这种情况下,lambda 接收作为输入
String[],同样,数组没有方法
get()。这里我们只是删除并按原样
get()传入argstream()工作示例
出去
更新
立即返回 Stream+Supplier
既然我们无法改变
然后我们需要调整,以免出现任何错误。
testCases().map(/**...*/)避免调用时出错,我们不应该将调用包装在testCases()中Arrays.stream(/**...*/),而是立即返回一个 Stream fromtestCases()... 然后 map 就可以正常工作了arg.get()我们
String[]在输入处进行的调用,但如您所知String[],它没有方法get()......并且想着他们可以在那里等待 - 我没有想出更好的功能接口
Supplier,所能做的就是使用方法返回元素get()结论:
什么对应于阶乘
更新 2
当我开始写解释时,我意识到最好将所有事情简化到不可能的程度——这对你来说会更清楚、更简单、更实用。
我恢复到没有迭代器、生成器等的旧版本......所以一切都可以静态设置和检索。
实际上,整个诀窍就是我
Stream<String[]>,它有一个字符串数组作为元素,在Stream<Supplier<String[]>>流中的每个元素都可以使用功能接口接收一个字符串数组Supplier<T>对于后者,您只需要调用该方法
map()并在那里传递一个 lambda,它将一个字符串数组String[]转换为 lambdaSupplier<String>我们这样做:
以及该方法的工作版本:
结论: