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 []?
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
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()
.