ile
stream
ve
lambda
ile mümkün ve yararlı olduğunu düşünüyorum.
Biz böyle bir şey ile başlar: en de listelerde değerleri benzersiz olmasını varsayalım
1: a,b,c
2: d,e,f
etc.
:
Map<Integer, List<String>> mapFrom = new HashMap<>();
en o mapFrom yerde nüfuslu, ve gibi görünüyor varsayalım. (
foreach
kullanarak, çok benzer şekilde veya)
a: 1
b: 1
c: 1
d: 2
e: 2
f: 2
etc.
böyle yapabileceğini:
Şimdi, bunun gibi ikinci harita almak için "açılmak" isteyen
Map<String, Integer> mapTo = new HashMap<>();
for (Map.Entry<Integer, List<String>> entry: mapFrom.entrySet()) {
for (String s: entry.getValue()) {
mapTo.put(s, entry.getKey());
}
}
Şimdi İç içe for
döngüler yerine lambda kullanmak istediğimizi varsayalım. benim boyutluluk sorunu kurtulmak yardımcı olsa da, baz, ben de flatMap
bir deneyin verdi
Map<String, Integer> mapTo = mapFrom.entrySet().stream().map(e -> {
e.getValue().stream().?
// Here I can iterate on each List,
// but my best try would only give me a flat map for each key,
// that I wouldn't know how to flatten.
}).collect(Collectors.toMap(/*A String value*/,/*An Integer key*/))
, ama gitmek için doğru yol olduğunu sanmıyorum: Ben muhtemelen böyle bir şey yapacağını Bu süreçte anahtarı kaybediyorum. Özetle
, benim iki soru vardır:- o bunu başarmak için
streams
velambda
kullanmak mümkün mü? - Böyle yapmak (performans, okunabilirlik) yararlı mıdır?
entrySet.stream() .flatMap(e -> e.getValue().stream() .map(s -> new SimpleImmutableEntry(e.getKey(), s)));
SimpleImmutableEntry
AbstractMap
bir iç içe sınıftır şu şekildedir:
Kesinlikle 'flatMap': 'entrySet.stream(). Isterseniz flatMap (e -> e.getValue(). Stream(). Map (s -> new SimpleImmutableEntry (e.getKey(), s))' –
@MarkoTopolnik yorumunuz cevap olmalıdır – Mena
@MarkoTopolnik bir cevap olmalıdır – Eugene