2016-04-01 35 views
15

Voglio iniziare un Map<String, BigDecimal> e voglio sempre inserire lo stesso valore BigDecimal dall'esterno del flusso.Come creare una mappa con Java stream API utilizzando un valore esterno allo stream?

BigDecimal samePrice; 
Set<String> set; 

set.stream().collect(Collectors.toMap(Function.identity(), samePrice)); 

Tuttavia Java lamenta come segue:

Il metodo toMap (Funzione, Funzione) nel tipo collezionisti non è applicabile per gli argomenti (Funzione, BigDecimal)

Perché non posso usare il BigDecimal dall'esterno? Se scrivo:

et.stream().collect(Collectors.toMap(Function.identity(), new BigDecimal())); 

funzionerebbe, ma ovviamente non è quello che voglio.

risposta

15

Il secondo argomento (come il primo) di toMap(keyMapper, valueMapper) è una funzione che accetta l'elemento stream e restituisce il valore della mappa.

In questo caso, si consiglia di ignorare in modo da poter avere:

set.stream().collect(Collectors.toMap(Function.identity(), e -> samePrice)); 

Nota che il secondo tentativo non avrebbe funzionato per la stessa ragione.

9

Collectors#toMap aspetta due Functions

set.stream().collect(Collectors.toMap(Function.identity(), x -> samePrice)); 

È possibile trovare quasi lo stesso esempio nel JavaDoc

Map<Student, Double> studentToGPA 
    students.stream().collect(toMap(Functions.identity(), 
            student -> computeGPA(student))); 
6

Come già detto in altre risposte, è necessario specificare una funzione che associa ogni elemento al valore fisso come element -> samePrice.

In aggiunta, se si desidera riempire specificamente un ConcurrentHashMap, v'è una caratteristica pulito che non ha bisogno di un'operazione di flusso a tutti:

ConcurrentHashMap<String,BigDecimal> map = new ConcurrentHashMap<>(); 
map.keySet(samePrice).addAll(set); 

Purtroppo, non v'è alcuna operazione per arbitraria Map S.