0

フィールドを持つ人物クラスがあるとします。

Class Person {
  private String name;
  private Integer id (this one is unique);
}

そして、次のList<Person> peopleようなものがあります。

['Jerry', 993]
['Tom', 3]
['Neal', 443]
['Jerry', 112]
['Shannon', 259]
['Shannon', 533]

List<Person> uniqueNames一意の名前のみをフィルタリングし、その名前の最高の ID を保持するように新しいものを作成するにはどうすればよいですか。

したがって、最終リストは次のようになります。

['Jerry', 993]
['Tom', 3]
['Neal', 443]
['Shannon', 533]
4

4 に答える 4

3

Collectors#toMapこんな感じで使えます。

record Person(String name, Integer id) {}

public static void main(String[] args) {
    List<Person> input = List.of(
        new Person("Jerry", 993),
        new Person("Tom", 3),
        new Person("Neal", 443),
        new Person("Jerry", 112),
        new Person("Shannon", 259),
        new Person("Shannon", 533));

    List<Person> output = input.stream()
        .collect(Collectors.toMap(Person::name, Function.identity(),
            (a, b) -> a.id() > b.id() ? a : b, LinkedHashMap::new))
        .values().stream().toList();

    for (Person e : output)
        System.out.println(e);
}

出力:

Person[name=Jerry, id=993]
Person[name=Tom, id=3]
Person[name=Neal, id=443]
Person[name=Shannon, id=533]

, LinkedHashMap::new順序を気にしない場合は省略できます。

于 2021-10-14T21:47:15.057 に答える