在 Java 中,如果你有一个 List<T>,并且需要把它传给一个方法的可变参数(varargs) ,可以通过 toArray 来实现。关键点是:可变参数在底层就是一个数组。
import java.util.List;
import java.util.ArrayList;
public class VarargsExample {
public static void main(String[] args) {
// 假设我们有一个List<String>
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
**//调用一个接受可变参数的方法
printStrings(list.toArray(new String[0]));
}
*//*可变参数方法
public static void printStrings(String... strings) {
for (String s : strings) {
System.out.println(s);
}
}
}
关键点说明
- list.toArray(new String[0]) 会返回一个 String[],这是可变参数的底层类型。
- 如果你的方法是 children(DslTestPlanChild... children),而你有 List<DslTestPlanChild>,可以这样:
children(list.toArray(new DslTestPlanChild[0]))
总结
- List → Array → Varargs 是标准做法。
- new T[0] 是惯用写法,JVM 会自动分配正确大小的数组。
java
package com.example.dsl.runner;
import com.example.dsl.model.Step;
import com.example.dsl.curl.CurlParser;
import com.example.dsl.model.ParsedCurl;
import static us.abstracta.jmeter.javadsl.JmeterDsl.*;
import us.abstracta.jmeter.javadsl.core.controllers.DslTransactionController;
import us.abstracta.jmeter.javadsl.core.threadgroups.DslDefaultThreadGroup;
import us.abstracta.jmeter.javadsl.http.*;
import java.nio.file.*;
import java.util.*;
public class CsvStepRunner {
public static List<Step> loadCsv(String csvPath) {
List<Step> list = new ArrayList<>();
try {
List<String> lines = Files.readAllLines(Paths.get(csvPath));
lines.remove(0);
for (String l : lines) {
String[] p = l.split(",");
Step s = new Step();
s.type = p[0];
s.curl = p[1];
s.extractPath = p.length>2 ? p[2] : "";
s.extractVar = p.length>3 ? p[3] : "";
s.assertPath = p.length>4 ? p[4] : "";
s.assertExpected = p.length>5 ? p[5] : "";
list.add(s);
}
} catch (Exception e) { throw new RuntimeException(e); }
return list;
}
public static DslDefaultThreadGroup buildPlanFromCsv(String csvPath) {
List<Step> steps = loadCsv(csvPath);
List<DslHttpSampler> samplers = new ArrayList<>();
for (Step s : steps) {
ParsedCurl pc = CurlParser.parse(s.curl);
DslHttpSampler sampler = httpSampler(pc.url).method(pc.method);
pc.headers.forEach(sampler::header);
if (pc.body != null) sampler.body(pc.body);
if (s.extractPath != null && !s.extractPath.isEmpty()) {
sampler.children(jsonExtractor(s.extractVar, s.extractPath));
}
if (s.assertPath != null && !s.assertPath.isEmpty()) {
sampler.children(jsonAssertion(s.assertPath).matches(s.assertExpected));
}
samplers.add(sampler);
}
System.out.println(samplers.toString().getClass());
DslTransactionController t = transaction("my tr", samplers.toArray(new DslHttpSampler[0]));
return threadGroup(1, 1, transaction("", t)).children(
jsr223PostProcessor(c ->System.out.println(c.prevMap())),
jsr223PostProcessor(c ->System.out.println(c.prevRequest())),
jsr223PostProcessor(c ->System.out.println(c.prevResponse()))
);
}
}