2017-06-01 4 views
6

Je suis en train de convertir une liste 2D en un tableau 2D int. Cependant, il semble que je ne peux que collecter des objets, pas des primitives.Comment collecter les résultats d'un flux dans un tableau primitif?

Quand je fais:

data.stream().map(l -> l.stream().toArray(int[]::new)).toArray(int[][]::new); 

Je reçois l'erreur de compilation Cannot infer type argument(s) for <R> map(Function<? super T,? extends R>). Cependant, si je change int[] en Integer[], il compile. Comment puis-je l'utiliser pour utiliser int?

+2

Pour le lambda, essayez 'l.stream(). MapToInt (entier :: intValue) .toArray()' – 4castle

+0

Comment puis-je recueillir les résultats de ce bien? Cela ne fait que des opérations sur le Stream sans stocker les résultats. –

+2

Ma suggestion gère le lambda incorrect que vous utilisiez. Il va collecter correctement maintenant. – 4castle

Répondre

6

Utilisation de la méthode mapToInt pour produire un courant d'entiers primitifs:

int[][] res = data.stream().map(l -> l.stream().mapToInt(v -> v).toArray()).toArray(int[][]::new); 

L'appel toArray interne n'a plus besoin int[]::new, parce que IntStream produit int[].

Demo.