我需要转换
String[] args = {"--path=C:/log", "--time=hourly"};
到
String[] args = {"--path", "C:/log", "--time", "hourly"};
如何在Java 8中以优雅的方式完成此任务?
List<String> newArgs = Lists.newArrayList();
for (String s : args) {
String[] split = s.split("=");
newArgs.add(split[0]);
newArgs.add(split[1]);
}
String[] strarray = new String[newArgs.size()];
return newArgs.toArray(strarray);
答案 0 :(得分:9)
String[] result = Stream.of(args)
.flatMap(a -> Stream.of(a.split("=")))
.toArray(String[]::new);
答案 1 :(得分:6)
其他答案在技术上都很好,但真正的答案是:不要。
不要重新发明轮子。解析命令行选项实际上是 hard 。无论你为第一步做出什么工作,但假设我们正在谈论的是一些旨在持久的东西,并且足以吸引用户 - 那么迟早,你花了越来越多的时间来处理选项。
因此:不要自己做任何事情(这当然有点乐趣)接受解析命令行选项是已解决的问题。只需获得一个现有解决方案,请参阅here作为初学者。
答案 2 :(得分:1)
如果您想使用 Java 8 代码,可以使用 Stream API (documentation)。
因此,您应首先使用实用工具方法args
(documentation)将Stream<String>
数组转换为Arrays#stream
。然后使用=
(documentation)将参数拆分为String#split
,然后使用array
(documentation)将其再次收集到Stream#toArray
。
为了将每个分割值视为常规值(而不是嵌套数据),您可能希望展平 Stream
。因此,您希望拥有像Stream<String[]>
这样的扁平结构,而不是Stream<String>
。您可以使用Stream#flatMap
方法(documentation)来完成此操作。
以下是使用解释方法的变体:
String[] data = Arrays.stream(args) // String
.map(arg -> arg.split("=")) // String[]
.flatMap(Arrays::stream) // String
.toArray(String[]::new);
您也可以预先记住模式,然后使用Pattern#splitAsStream
(documentation):
Pattern patt = Pattern.compile("=");
List<String> data = Arrays.stream(args) // String
.map(patt::splitAsStream) // String[]
.flatMap(Arrays::stream) // String
.toArray(String[]::new);
答案 3 :(得分:0)
这将生成一个List,但你可以对其进行转换。
final List<String> parts = Arrays.stream(args)
.flatMap(argument -> Arrays.stream(argument.split("=")))
.collect(Collectors.toList());
您可以考虑argument.split("=", 2)
。
答案 4 :(得分:0)
String[] args = {"--path=C:/log", "--time=hourly"};
args = String.join("=", args).split("=");
System.out.println(Arrays.toString(args));
答案 5 :(得分:0)
我对流的性能有点怀疑,但是由于Hulk的评论,我意识到你需要预热lambda执行(运行至少两次)以获得合理的结果。
public class StreamTest {
public static void main(String[] args) {
// will include lambda warm up time
java8test();
java8test();
java7test();
}
public static void java8test() {
List<String> test = new ArrayList<>();
test.add("--path=C:/log");
test.add("--time=hourly");
long start = System.nanoTime();
List<String> result = test.stream().flatMap(e->{
String[] array = e.split("=");
return Stream.of(array);
}).collect(Collectors.toList());
long end = System.nanoTime();
System.out.println("Java 8 style: " + (end-start) + "ns: " + result);
}
public static void java7test() {
String[] test2 = {"--path=C:/log", "--time=hourly"};
long start = System.nanoTime();
test2 = String.join("=", test2).split("=");
long end = System.nanoTime();
System.out.println("old style: " + (end-start) + "ns:" + Arrays.toString(test2));
}
}
性能:
Java 8 style: 188154148ns: [--path, C:/log, --time, hourly]
Java 8 style: 129220ns: [--path, C:/log, --time, hourly]
old style: 364275ns:[--path, C:/log, --time, hourly]