J'ai le tableau suivant en Java:
The method collect(Supplier<R>, ObjIntConsumer<R>, BiConsumer<R,R>) in the type IntStream is not applicable for the arguments (Collector<Object,?,Map<Object,Object>>)
Je veux le convertir en une instance java.util.Map qui a le index du tableau en tant que clés et la valeur à l'index en tant que valeurs pour la carte. Comme ça,
Type mismatch: cannot convert from Collector<Object,capture#1-of ?,Map<Object,Object>> to Supplier<R>
J'ai essayé ce qui suit:
IntStream.range(0, arr.length)
.collect(Collectors.toMap(k -> k, k -> arr[k]));
Mais cela entraîne des erreurs de compilation comme: p >
0 = 4 1 = 5 2 = 6
et
int arr[] = {4,5,6};
Qu'est-ce que je fais de mal ici?
Je vais juste plus tous les indices, puis les mapper sur des clés et des valeurs où je me trompe?
4 Réponses :
Essai :
0 = 4 1 = 5 2 = 6
int arr[] = {4,5,6};
Map<Integer, Integer> resultMap = IntStream.range(0, arr.length).boxed()
.collect(Collectors.toMap(Function.identity(), k -> arr[k]));
resultMap.entrySet().forEach(entry -> System.out.println(entry.getKey() + " = " + entry.getValue()));
Integer # valueOf n'est pas nécessaire.
@Jason merci, j'ai mis à jour la réponse
Pas de soucis, également au lieu d'utiliser k -> k, vous pouvez simplement utiliser Function # identity pour utiliser la valeur d'entrée du Stream et la clé de la carte.
@NitinBisht Qu'est-ce que Function.identity () ?
@ ng.newbie Function.identity () renvoie une fonction qui renvoie toujours son argument d'entrée.
@ ng.newbie vous pouvez également l'utiliser comme Collectors.toMap (k -> k, k -> arr [k]) . Bien que pour mieux comprendre, vous pouvez vous référer à stackoverflow.com/a/28041480/8258942
Vous devez mettre en boîte l'IntStream et utiliser la valeur groupingBy pour obtenir le nombre souhaité.
Essayez ceci:
Map<Integer, Long> map = Arrays
.stream(arr)
.boxed()
.collect(Collectors.groupingBy(e -> e, Collectors.counting()));
Vous utilisez IntStream qui est déballé. Vous devez utiliser .boxed () .
Si votre tableau est ordonné, vous pouvez faire:
Map<Integer, Integer> map = IntStream.range(0, arr.length).boxed()
.collect(Collectors.toMap(Function.identity(), i -> arr[i]));
S'il n'est pas commandé, vous pouvez faire:
int arr[] = {4,5,6};
Map<Integer, Integer> map = Arrays.stream(arr).boxed()
.collect(Collectors.toMap(i -> Arrays.binarySearch(arr, i), Function.identity()));
map.entrySet().forEach(entry -> System.out.println(entry.getKey() + " = " + entry.getValue()));
Qu'est-ce que Function.identity () ??
C'est similaire à i -> i (mais pas le même). De javadoc: "Renvoie une fonction qui renvoie toujours son argument d'entrée.". Si vous souhaitez obtenir plus d'informations, essayez cette réponse: stackoverflow.com/questions/28032827/...
Il existe plusieurs solutions.
1. Pour chaque boucle
Map<Integer, Integer> map = Stream.iterate(0, i -> i+1)
.limit(arr.length)
.collect(Collectors.toMap(Function.identity(), i -> arr[i]));
À mon avis, c'est la plus claire en termes de lisibilité.
2. IntStream avec une plage de la longueur du tableau
Map<Integer, Integer> map = IntStream.range(0, arr.length)
.boxed()
.collect(Collectors.toMap(Function.identity(), i -> arr[i]));
Cela semble être votre tentative initiale. Vous devez soit boxer avec boxed () à Stream afin d'utiliser collect avec un seul Collector code >.
3. Stream :: iterate et Stream::limit final
Map<Integer, Integer> map = new HashMap<>();
for (int i=0; i<arr.length; i++) {
map.put(i, arr[i]);
}
C'est une simple génération sans fin d'une séquence par un limitée par la longueur du tableau.
Est-ce que cela répond à votre question? Tableau int Java 8 à mapper
IntStreamn'a qu'une seule méthode decollecte: docs.oracle. com / fr / java / javase / 11 / docs / api / java.base / java / ut il /… . Essayez de le mapper à unStream comme ceci:IntStream.range (0, arr.length) .mapToObj (Integer :: valueOf) .collect (Collectors.to Map ( k -> k, k -> Integer.valueOf (arr [k.intValue ()])));.Essayez d'utiliser un Stream of Integer en utilisant plutôt IntStream # boxed.