Comment créer une carte avec l’API de stream Java en utilisant une valeur en dehors du stream?

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.