Je veux lancer une Map
et je veux toujours mettre la même valeur BigDecimal
depuis l’extérieur du stream.
BigDecimal samePrice; Set set; set.stream().collect(Collectors.toMap(Function.identity(), samePrice));
Cependant, Java se plaint comme suit:
La méthode toMap (Function, Function) dans le type Collectors n’est pas applicable pour les arguments (Function, BigDecimal)
Pourquoi ne puis-je pas utiliser le BigDecimal de l’extérieur? Si j’écris:
set.stream().collect(Collectors.toMap(Function.identity(), new BigDecimal()));
cela fonctionnerait, mais ce n’est bien sûr pas ce que je veux.
Le second argument (comme le premier) de toMap(keyMapper, valueMapper)
est une fonction qui prend l’élément stream et renvoie la valeur de la map.
Dans ce cas, vous voulez l’ignorer pour pouvoir:
set.stream().collect(Collectors.toMap(Function.identity(), e -> samePrice));
Notez que votre deuxième tentative ne fonctionnerait pas pour la même raison.
Collectors#toMap
attend deux Functions
set.stream().collect(Collectors.toMap(Function.identity(), x -> samePrice));
Vous pouvez trouver à peu près le même exemple dans JavaDoc
Map
studentToGPA students.stream().collect(toMap(Functions.identity(), student -> computeGPA(student)));
Comme déjà dit dans les autres réponses, vous devez spécifier une fonction qui mappe chaque élément à la valeur fixe comme element -> samePrice
.
En outre, si vous voulez remplir spécifiquement une ConcurrentHashMap
, il existe une fonctionnalité intéressante qui ne nécessite aucune opération de stream:
ConcurrentHashMap map = new ConcurrentHashMap<>(); map.keySet(samePrice).addAll(set);
Malheureusement, il n’y a pas de telles opérations pour les Map
arbitraires.