web-dev-qa-db-fra.com

Java stream toArray () converti en un type spécifique de tableau

C’est peut-être très simple, mais j’ai la moindre idée de Java 8 fonctionnalités et je ne sais pas comment y parvenir. J'ai cette simple ligne qui contient le texte suivant:

"Clé, Nom"

et je veux convertir cette ligne en un tableau String, en séparant chaque valeur par une virgule (,). Toutefois, je souhaite également couper chaque champ avant de renvoyer le tableau final. J'ai donc procédé comme suit:

Arrays.stream(line.split(",")).map(String::trim).toArray();

Cependant, cela retourne un tableau Object [] plutôt qu'un tableau String []. Après une inspection plus poussée, je peux confirmer que le contenu est en réalité une instance de String, mais que le tableau lui-même est constitué d'éléments Object. Laissez-moi illustrer ceci, voici ce que le débogueur dit de l'objet retourné:

Object[]:
    0 = (String) "Key"
    1 = (String) "Name"

Autant que je sache, le problème réside dans le type de retour de l'appel de carte, mais comment puis-je lui faire renvoyer un tableau String []?

61
arielnmz

Utilisez toArray(size -> new String[size]) ou toArray(String[]::new).

String[] strings = Arrays.stream(line.split(",")).map(String::trim).toArray(String[]::new);

Ceci est en fait une expression lambda pour

.toArray(new IntFunction<String[]>() {
        @Override
        public String[] apply(int size) {
            return new String[size];
        }
    });

Où vous dites convertir le tableau en un tableau String de même taille.

De la docs

La fonction de générateur prend un entier, qui est la taille du tableau souhaité, et produit un tableau de la taille souhaitée. Cela peut être exprimé de manière concise avec une référence de constructeur de tableau:

 Person[] men = people.stream()
                      .filter(p -> p.getGender() == MALE)
                      .toArray(Person[]::new);

Paramètres de type:

A - le type d'élément du tableau résultant

Paramètres:

générateur - une fonction qui produit un nouveau tableau du type souhaité et de la longueur fournie

104
Mritunjay

String[]::new est une fonction qui appelle la new "pseudo-méthode" du type String[], tout comme String::trim est une fonction qui appelle la méthode réelle trim de le type de chaîne. La valeur transmise à la fonction String::new par toArray est la taille de la collection située à droite de l'invocation de la méthode .toArray ().

Si vous remplaciez String[]::new par n->new String[n], vous seriez peut-être plus à l'aise avec la syntaxe, tout comme vous pourriez remplacer String::trim par le moins cool s->s.trim().

4
Paul Buis