groupingBy()はgrouping keyとなるものをFunctionとして指定
Map(key, List)をreturnする。
partitioningBy()はtrue/false conditionとなるものをPredicateとして指定
Map(key, List)をreturnする。
Collectorをsecond argumentに追加すると、Listに対してさらに処理してくれる。
class SampleClass {
String name;
int price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public SampleClass(String name, int price) {
this.name = name;
this.price = price;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public String toString() {
return "name:" + name + ", price=" + price;
}
}
public class Outer {
public static void main(String[] args) {
List<SampleClass> l = List.of(
new SampleClass("sato-a",100),
new SampleClass("sato-a",200),
new SampleClass("sato-b1",300),
new SampleClass("sato-b1",400)
);
Stream<SampleClass> s = l.stream();
Map<String, Integer> mp = s.collect(Collectors.groupingBy(SampleClass::getName, Collectors.summingInt(SampleClass::getPrice)));
System.out.println(mp);
s = l.stream();
Map<String, List<SampleClass>> mp3 = s.collect(Collectors.groupingBy(SampleClass::getName));
System.out.println(mp3);
s = l.stream();
Map<Boolean, List<SampleClass>> mp2 = s.collect(Collectors.partitioningBy(x -> x.getName().length() == 6));
System.out.println(mp2);
}
}
{sato-a=300, sato-b1=700}
{sato-a=[name:sato-a, price=100, name:sato-a, price=200], sato-b1=[name:sato-b1, price=300, name:sato-b1, price=400]}
{false=[name:sato-b1, price=300, name:sato-b1, price=400], true=[name:sato-a, price=100, name:sato-a, price=200]}