如何将String [] args转换为" ="在java 8中拆分

时间:2017-11-27 14:39:06

标签: java arrays java-8 args

我需要转换

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

6 个答案:

答案 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)。

因此,您应首先使用实用工具方法argsdocumentation)将Stream<String>数组转换为Arrays#stream。然后使用=documentation)将参数拆分为String#split,然后使用arraydocumentation)将其再次收集到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#splitAsStreamdocumentation):

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]