私は、対応する結果がCollector.groupingBy(Function, groupingBy(classifier, toList())
マルチレベルマップは、()(コレクト)groupingBy()と還元()
Map<String, Map<Person.Sex, List<Person>>> groupByYearThenSex = personList.stream().collect(
groupingBy(p ->{
if(p.getYear() > 2015) return "New members";
else if(p.getYear() < 2009) return "Senior members";
else return "Normal members";
},
groupingBy(Person::getSex)
)
);
groupByYearThenSex.forEach((String y, Map<Person.Sex, List<Person>> m) ->{
System.out.println("\n" + y);
m.forEach((Person.Sex s, List<Person> p) -> {
System.out.println(" " + s);
p.forEach((Person prsn) -> {
System.out.println(" " + prsn.toString());
});
});
});
を書くために管理:
New members
MALE
Person{name: Gawel, age: 23, sex: MALE}
Normal members
MALE
Person{name: Patryk, age: 34, sex: MALE}
Person{name: Pawel, age: 21, sex: MALE}
Person{name: Bolek, age: 12, sex: MALE}
Person{name: Lolek, age: 12, sex: MALE}
FEMALE
Person{name: Jola, age: 70, sex: FEMALE}
Person{name: Ala, age: 25, sex: FEMALE}
Senior members
FEMALE
Person{name: Iwona, age: 34, sex: FEMALE}
Person{name: Oliwia, age: 17, sex: FEMALE}
今、私がしようとしています次のように最も古いメンバーだけを一覧表示するマルチレベルマップを作成します。
New members
MALE
Person{name: Gawel, age: 23, sex: MALE}
Normal members
MALE
Person{name: Patryk, age: 34, sex: MALE}
FEMALE
Person{name: Jola, age: 70, sex: FEMALE}
Senior members
FEMALE
Person{name: Iwona, age: 34, sex: FEMALE}
以下のコードは機能しません。私は、変数RRは私がFunction<R,RR>
=>collectingAndThen(reducing(), Optional)
を考えている互換性のない境界エラーを、持っている推論」を取得。私は最も古いものを得るために人の流れを削減し、?
Map<String, Map<Person.Sex, List<Person>>> groupByYearThenSexOldest = personList.stream().collect(
groupingBy(p ->{
if(p.getYear() > 2015) return "New members";
else if(p.getYear() < 2009) return "Senior members";
else return "Normal members";
},
groupingBy(Person::getSex, collectingAndThen(
reducing((p1, p2) -> p1.getAge() > p2.getAge() ? p1 : p2),
Optional::get)
)
)
);