2016-04-01 5 views
15

Map<String, BigDecimal>を初期化しておき、ストリームの外側から常に同じBigDecimal値を入れたいとします。ストリーム外の値を使用してJavaストリームAPIを使用してマップを作成するにはどうすればよいですか?

BigDecimal samePrice; 
Set<String> set; 

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

次のようにしかし、Javaは文句:タイプコレクターで

方法toMap(関数、関数)の引数には適用されません (機能、BigDecimalを)

なぜ外部からBigDecimalを使用することはできませんか?私が書く場合:

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

それはうまくいくが、それはもちろん私がしたいものではない。

答えて

15

toMap(keyMapper, valueMapper)の第2引数(最初のものと同じ)は、ストリーム要素を受け取り、マップの値を返す関数です。この場合

、あなたが持っていることができますので、それを無視したい:あなたの第二の試みは、同じ理由で動作しないこと

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

注意を。

9

Collectors#toMapは2 Functions

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

あなたはJavaDoc

内のほぼ同じ例を見つけることができます期待し
Map<Student, Double> studentToGPA 
    students.stream().collect(toMap(Functions.identity(), 
            student -> computeGPA(student))); 
6

、あなたは関数を指定する必要があるとして、すでに他の回答で述べてそれぞれの要素をelement -> samePriceのような固定値にマップします。あなたは、具体的ConcurrentHashMapを埋めるためにしたい場合はさらにとして

は、全くストリームの操作を必要としない巧妙な機能があります:

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

は残念ながら、任意には、このような操作はありませんMap s。

関連する問題