2つのSetの要素を足したい時があり、その時に実装悩んだので共有です。
オススメ度順に上から並べています。
GuavaのIterablesを使う
一番スッキリしてる気がする
return Sets.newHashSet(Iterables.concat(hashSet1, hashSet2));
それぞれStreamにしてからStream.concat()でつなげる
王道な気がする
return Stream.concat(
hashSet1.stream(),
hashSet2.stream())
.collect(Collectors.toSet());
SetのStreamをflatMapでStreamをつくる
ちょっとぱっと見わかりにくい気もする
return Stream.of(hashSet1, hashSet2)
.flatMap(Collection::stream)
.collect(Collectors.toSet());
Set.addAll()を使う
戻り値がbooleanなのが残念・・・
return set1.addAll(set2);
みたいな感じに書きたかった。
Set<String> result = new HashSet<>();
result.addAll(set1);
result.addAll(set2);
return result;
補足:速度検証
それぞれの速度を検証してみました。
100個のランダムな1000以下の数字のStringのSetを足しています。
1000000回演算を行って、平均から時間を取得しています。
5240ns
4002ns
4162ns
3974ns
結果は、最初のGuavaを使う場合が微妙に遅いですね。
1.5倍弱なのでそんなに差は無い気もしますが頭の片隅にいれておいてもいいかもしれません。
速度検証のソースコードは以下に配置しました。
追記
中央値の方が速度の評価にはよいとFB受けたので中央値も計測してみました!
5043ns
3827ns
4033ns
3868ns