奇妙な質問だけです。プロダクション/仲間のために、はるかに理解できるものを書く方が良いです。
interface EntryConsumer<K, V> {
void apply(K key, V v1, V v2);
}
public static <K, V> void fancyStreams(Map<K, V> m1, Map<K, V> m2, EntryConsumer<K, V> consumer) {
Stream
.concat(m1.entrySet().stream(), m2.entrySet().stream())
.filter(e -> e.getValue() != null) // filter out nulls
.collect(Collectors.groupingBy(Map.Entry::getKey))
.entrySet()
.stream()
.filter(e -> e.getValue().size() == 2) // filter out non-matching key-values
.forEach(e -> consumer.apply(e.getKey(), e.getValue().get(0).getValue(), e.getValue().get(1).getValue()));
}
public static <K, V> void plainOldIteration(Map<K, V> m1, Map<K, V> m2, EntryConsumer<K, V> consumer) {
m1.entrySet()
.forEach(e -> {
if (m2.containsKey(e.getKey()))
consumer.apply(e.getKey(), e.getValue(), m2.get(e.getKey()))
});
}
// Actual usage
Map<String, Integer> m1, m2;
m1 = Maps.of("1", 22, "2", 23);
m2 = Maps.of("1", 20, "2", 19, "3", 21);
fancyStreams(m1, m2, (k, v1, v2) -> System.out.println(k + ": " + (v1 + v2)));
plainOldIteration(m1, m2, (k, v1, v2) -> System.out.println(k + ": " + (v1 + v2)));
そして、あなたの実際の要求(少し冗長)
public class EntryStream<K, V> {
private final Map<K, V> m1;
private final Map<K, V> m2;
private EntryStream(Map<K, V> m1, Map<K, V> m2) {
this.m1 = m1;
this.m2 = m2;
}
public static <K, V> EntryStream<K, V> of(Map<K, V> m1, Map<K, V> m2) {
return new EntryStream<>(m1, m2);
}
public void forEachCorrespondingEntry(EntryConsumer<K, V> consumer) {
m1.entrySet()
.forEach(e -> {
if (m2.containsKey(e.getKey())) consumer.apply(e.getKey(), e.getValue(), m2.get(e.getKey()));
});
}
}
// Usage
EntryStream.of(m1, m2).forEachCorrespondingEntry((k, v1, v2) -> System.out.println(k + ": " + (v1 + v2)));
m1' 'オーバーだけ' forEach'、によって提供さ 'm1'キーで' GET'を使用して 'm2'をキャプチャ'forEach'を呼び出して' doSomething'を呼び出します。 –
Uhmmm ... Javaがm2のルックアップを処理して、結果を提供してくれるかどうかを尋ねていただけです。私はすでにコードを古いJava 7の方法で実装しています。 PSではm1にストリームするのが無用でm2に乗る必要があります。私は上司に印象的な例を示しました。 –
2つのマップから 'MultiMap'を作成し、それらの結果をストリームします。または、2つの値を持つ独自の 'Map'を作成し、それをストリームします(' Collection'または 'List'値を扱う必要はありません)。 –