12

私は次のクラスを持っています。

class Person {

    String name;
    LocalDate birthday;
    Sex gender;
    String emailAddress;

    public int getAge() {
        return birthday.until(IsoChronology.INSTANCE.dateNow()).getYears();
    }

    public String getName() {
        return name;
    }
}

年齢別にグループ化し、Person オブジェクト自体ではなく、人の名前のリストを収集できるようにしたいと考えています。すべてが 1 つの素敵なランバ式にまとめられています。

これらすべてを簡素化するために、年齢別にグループ化した結果を格納する現在のソリューションをリンクし、それを反復処理して名前を収集します。

ArrayList<OtherPerson> members = new ArrayList<>();

members.add(new OtherPerson("Fred", IsoChronology.INSTANCE.date(1980, 6, 20), OtherPerson.Sex.MALE, "fred@example.com"));
members.add(new OtherPerson("Jane", IsoChronology.INSTANCE.date(1990, 7, 15), OtherPerson.Sex.FEMALE, "jane@example.com"));
members.add(new OtherPerson("Mark", IsoChronology.INSTANCE.date(1990, 7, 15), OtherPerson.Sex.MALE, "mark@example.com"));
members.add(new OtherPerson("George", IsoChronology.INSTANCE.date(1991, 8, 13), OtherPerson.Sex.MALE, "george@example.com"));
members.add(new OtherPerson("Bob", IsoChronology.INSTANCE.date(2000, 9, 12), OtherPerson.Sex.MALE, "bob@example.com"));

Map<Integer, List<Person>> collect = members.stream().collect(groupingBy(Person::getAge));

Map<Integer, List<String>> result = new HashMap<>();

collect.keySet().forEach(key -> {
            result.put(key, collect.get(key).stream().map(Person::getName).collect(toList()));
});

現在のソリューション

理想的ではなく、学習のために、よりエレガントでパフォーマンスの高いソリューションが必要です。

4

3 に答える 3

17

Stream をCollectors.groupingByでグループ化する場合、カスタム で値のリダクション操作を指定できますCollector。ここでCollectors.mappingは、関数 (マッピングとは何か) とコレクター (マッピングされた値を収集する方法) を取る を使用する必要があります。この場合、マッピングはPerson::getName、つまり Person の名前を返すメソッド参照であり、それを に収集しListます。

Map<Integer, List<String>> collect = 
    members.stream()
           .collect(Collectors.groupingBy(
               Person::getAge,
               Collectors.mapping(Person::getName, Collectors.toList()))
           );
于 2015-10-26T12:16:07.027 に答える
2

a を使用して、のリストを個人名のmapping Collectorリストにマップできます。Person

Map<Integer, List<String>> collect = 
    members.stream()
           .collect(Collectors.groupingBy(Person::getAge,
                                          Collectors.mapping(Person::getName, Collectors.toList())));
于 2015-10-26T12:10:51.157 に答える