1. ホーム

[解決済み】Java 8 プロパティで区別する

2022-04-30 12:46:49

質問

Java 8 では、コレクションをフィルタリングするために Stream 各オブジェクトのプロパティの明瞭性をチェックするAPIは?

例えば、私は Person オブジェクトを作成し、同姓同名の人を削除したい。

persons.stream().distinct();

に対してデフォルトの等号チェックを行います。 Person オブジェクトが必要なので、次のようなものが必要です。

persons.stream().distinct(p -> p.getName());

残念ながら distinct() メソッドにはそのようなオーバーロードはありません。メソッド内の等式チェックを変更せずに Person クラスは、これを簡潔に行うことが可能ですか?

どのように解決するのですか?

検討する distinct になります。 ステートフルフィルタ . ここでは、以前に見たことのあるものについての状態を保持し、与えられた要素が初めて見られたかどうかを返す述語を返す関数を紹介します。

public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
    Set<Object> seen = ConcurrentHashMap.newKeySet();
    return t -> seen.add(keyExtractor.apply(t));
}

そうすると、書けるようになります。

persons.stream().filter(distinctByKey(Person::getName))

なお、ストリームが順序付きで並列に実行される場合、これは 任意 というように、重複している要素の中から、最初のものではなく distinct() が行う。

(これは、基本的に 私の答え この質問に対する Java Lambda Stream Distinct() on arbitrary key? )