4 votes

Comment transformer des args String[] avec un split "=" en java 8

Je dois me transformer

String[] args = {"--path=C:/log", "--time=hourly"};

en

String[] args = {"--path", "C:/log", "--time", "hourly"};

Comment puis-je faire cela en Java 8, d'une manière élégante ?

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

9voto

Andrew Tobilko Points 1283
String[] result = Stream.of(args)
        .flatMap(a -> Stream.of(a.split("=")))
        .toArray(String[]::new);

6voto

GhostCat Points 83269

Les autres réponses sont toutes correctes d'un point de vue technique, mais la real La réponse est : ne le faites pas.

Ne pas réinventer la roue L'analyse des options de la ligne de commande est en fait dur . Ce que vous trouvez fonctionne pour la première étape, mais si nous parlons de quelque chose qui est destiné à durer et qui est suffisamment bon pour attirer les utilisateurs, alors tôt ou tard, vous passerez de plus en plus de temps à gérer les options.

Ainsi, au lieu de faire tout cela vous-même (ce qui est bien sûr un peu amusant), acceptez que l'analyse des options de la ligne de commande soit un processus résolu problème. Il suffit d'opter pour l'une des solutions existantes, voir aquí pour commencer.

1voto

Zabuza Points 11045

Explication

Comme vous souhaitez utiliser Java 8 vous pouvez utiliser le code API de flux ( la documentation ).

C'est pourquoi vous devez d'abord transformer votre args dans un tableau Stream<String> en utilisant la méthode de l'utilité Arrays#stream ( la documentation ). Ensuite, vous divisez les arguments par = en utilisant String#split ( la documentation ) et les rassembler ensuite dans un array en utilisant Stream#toArray ( la documentation ).

Afin de traiter chaque valeur fractionnée comme une valeur normale (et non comme des données imbriquées), vous pouvez souhaiter aplatir les Stream . Ainsi, au lieu de Stream<String[]> vous voulez avoir une structure aplatie comme Stream<String> . Pour ce faire, vous devez utiliser la fonction Stream#flatMap méthode ( la documentation ).


Code

Voici une variante utilisant l'approche expliquée :

String[] data = Arrays.stream(args)  // String
    .map(arg -> arg.split("="))      // String[]
    .flatMap(Arrays::stream)         // String
    .toArray(String[]::new);

Vous pouvez également mémoriser le motif à l'avance et l'utiliser ensuite. Pattern#splitAsStream ( la documentation ) :

Pattern patt = Pattern.compile("=");
List<String> data = Arrays.stream(args)  // String
    .map(patt::splitAsStream)            // String[]
    .flatMap(Arrays::stream)             // String
    .toArray(String[]::new);

0voto

Gorazd Rebolj Points 620

Cela produira une liste, mais vous pouvez la transformer.

final List<String> parts = Arrays.stream(args)
    .flatMap(argument -> Arrays.stream(argument.split("=")))
    .collect(Collectors.toList());

Vous pouvez envisager argument.split("=", 2) .

0voto

Eritrean Points 2744
    String[] args = {"--path=C:/log", "--time=hourly"};
    args = String.join("=", args).split("=");
    System.out.println(Arrays.toString(args));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X