package jp.yucchi.mystreamexample;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;
import jp.yucchi.mystreamexample.MyFriends.Sex;
public class MyStreamExample {
public static void main(String[] args) {
List<MyFriends> friend = new ArrayList<>();
friend.add(new MyFriends("柴田 恭平", LocalDate.of(1951, 8, 18), MyFriends.Sex.MALE, 90, 75, 80));
friend.add(new MyFriends("小栗 旬", LocalDate.of(1982, 12, 26), MyFriends.Sex.MALE, 85, 68, 77));
friend.add(new MyFriends("市原 隼人", LocalDate.of(1987, 2, 6), MyFriends.Sex.MALE, 88, 65, 76));
friend.add(new MyFriends("壇 蜜", LocalDate.of(1980, 12, 3), MyFriends.Sex.FEMALE, 85, 60, 89));
friend.add(new MyFriends("北川 景子", LocalDate.of(1986, 8, 22), MyFriends.Sex.FEMALE, 75, 54, 81));
friend.add(new MyFriends("綾瀬 はるか", LocalDate.of(1985, 3, 24), MyFriends.Sex.FEMALE, 88, 61, 91));
friend.add(new MyFriends("佐々木 希", LocalDate.of(1988, 2, 8), MyFriends.Sex.FEMALE, 80, 58, 82));
friend.add(new MyFriends("剛力 彩芽", LocalDate.of(1992, 8, 27), MyFriends.Sex.FEMALE, 77, 58, 84));
friend.add(new MyFriends("堀北 真希", LocalDate.of(1988, 10, 6), MyFriends.Sex.FEMALE, 78, 58, 83));
friend.add(new MyFriends("武井 咲", LocalDate.of(1993, 12, 25), MyFriends.Sex.FEMALE, 76, 58, 82));
friend.add(new MyFriends("深田 恭子", LocalDate.of(1982, 11, 2), MyFriends.Sex.FEMALE, 86, 62, 88));
friend.add(new MyFriends("はるな 愛", LocalDate.of(1976, 7, 21), MyFriends.Sex.OKAMA, 90, 60, 89));
friend.add(new MyFriends("マツコ・デラックス", LocalDate.of(1972, 10, 26), MyFriends.Sex.OKAMA, 150, 150, 150));
// MyFriends 全員表示
System.out.println("<-- MyFriends 全員表示 -->");
friend.stream().forEach((e) -> {
e.printMyFriends();
});
// 性別をキーにした Map を作りバストが 85 より大きい友達の人数を入れる。
System.out.println("\n<-- 性別をキーにした Map を作りバストが 85 より大きい友達の人数を入れる -->");
Map<Sex, Long> resultBreastSize = resultBreastSize = groupBySexAndBreast(friend);
System.out.println(resultBreastSize);
// 性別をキーにした Map を作りバストが 85 より大きい友達の人数を入れる。(別パターン)
System.out.println("\n<-- 性別をキーにした Map を作りバストが 85 より大きい友達の人数を入れる。(別パターン) -->");
Map<Sex, Long> resultBreastSize2 = resultBreastSize2 = groupBySexAndBreast2(friend);
System.out.println(resultBreastSize2);
// 性別が女性のバストの個数(個々では友達の人数)、合計、最小値、平均値、最大値を取得。
System.out.println("\n<-- 性別が女性のバストの個数(ここでは友達の人数)、合計、最小値、平均値、最大値を取得。 -->");
IntSummaryStatistics breastStatistics = breastAverageAndSum(friend);
System.out.println("count: " + breastStatistics.getCount() + "\n"
+ "sum: " + breastStatistics.getSum() + "\n"
+ "min: " + breastStatistics.getMin() + "\n"
+ "avarage: " + breastStatistics.getAverage() + "\n"
+ "max: " + breastStatistics.getMax());
// 女性だけをフィルタリングしてバストのサイズによって降順ソート。
System.out.println("\n<-- 女性だけをフィルタリングしてバストのサイズによって降順ソート。 -->");
List<MyFriends> f = breastSort(friend);
f.forEach(e -> {
System.out.println(e.getName() + ": Breast: " + e.getBreast());
});
// 女性でバストが 80 より大きい友達だけをフィルタリングしてバストの値に 1000 を足して合計する。
// reduce を使う! sum() のほうが便利だけどね。
System.out.println("\n<-- 女性でバストが 80 より大きい友達だけをフィルタリングしてバストの値に 1000 を足して合計する。 -->");
int breastSum = addBigBreast(friend);
System.out.println(breastSum);
// 性別によってグルーピングして年齢の若い順に表示させる。
System.out.println("\n<-- 性別によってグルーピングして年齢の若い順に表示させる。 -->");
Map<Sex, List<MyFriends>> resultGender = groupByGender(friend);
for (Map.Entry<Sex, List<MyFriends>> keyValue : resultGender.entrySet()) {
System.out.println(keyValue.getKey().toString());
for (int i = 0; i < keyValue.getValue().size(); i++) {
System.out.println(keyValue.getValue().get(i).getName() + " : " + keyValue.getValue().get(i).getAge());
}
}
// 女性のバストの大きさでグルーピングして年齢の若い順に表示させる。
System.out.println("\n<-- 女性のバストの大きさでグルーピングして年齢の若い順に表示させる。 -->");
Map<String, List<MyFriends>> resultBreastRank = groupByBreastRank(friend);
for (Map.Entry<String, List<MyFriends>> keyValue : resultBreastRank.entrySet()) {
System.out.println(keyValue.getKey().toString());
for (int i = 0; i < keyValue.getValue().size(); i++) {
System.out.println(keyValue.getValue().get(i).getName() + " : " + keyValue.getValue().get(i).getAge() + " Breast: " + keyValue.getValue().get(i).getBreast());
}
}
// 性別による平均年齢を計算。
System.out.println("\n<-- 性別による平均年齢を計算。 -->");
Map<Sex, Double> averageAge = groupingBySexAndAve(friend);
for (Map.Entry<Sex, Double> keyValue : averageAge.entrySet()) {
System.out.println(keyValue.getKey().toString() + " : " + keyValue.getValue().toString());
}
// 性別によるグルーピングをして人数の少ない順にソートする。
System.out.println("\n<-- 性別によるグルーピングをして人数の少ない順にソートする。 -->");
List<Sex> sortSex = sortSexCount(friend);
sortSex.forEach(System.out::println);
// 性別によるグルーピングをして人数の少ない順にソートする。人数も表示させる。
System.out.println("\n<-- 性別によるグルーピングをして人数の少ない順にソートする。人数も表示させる。 -->");
List<Entry<Sex, Long>> sortSex2 = sortSexCount2(friend);
sortSex2.forEach(f2 -> {
System.out.println(f2.getKey() + " : " + f2.getValue());
});
}
private static Map<Sex, Long> groupBySexAndBreast(List<MyFriends> friend) {
return friend.stream().collect(Collectors.groupingBy(MyFriends::getGender,
Collectors.collectingAndThen(Collectors.toList(), f -> f.stream()
.filter(fs -> fs.getBreast() > 85)
.count())));
}
private static Map<Sex, Long> groupBySexAndBreast2(List<MyFriends> friend) {
return friend.stream()
.collect(Collectors.groupingBy(MyFriends::getGender))
.entrySet()
.stream()
.collect(Collectors.toMap(entry -> entry.getKey(),
entry -> entry.getValue()
.stream()
.filter(f -> f.getBreast() > 85)
.count()));
}
private static IntSummaryStatistics breastAverageAndSum(List<MyFriends> friend) {
return friend.stream()
.filter(f -> f.getGender() == Sex.FEMALE)
.mapToInt(MyFriends::getBreast)
.summaryStatistics();
}
private static List<MyFriends> breastSort(List<MyFriends> friend) {
return friend.stream()
.filter(f -> f.getGender() == Sex.FEMALE)
.sorted((f1, f2) -> f2.getBreast() - f1.getBreast())
.collect(Collectors.toList());
}
private static int addBigBreast(List<MyFriends> friend) {
return friend.stream()
.filter(f -> f.getGender() == Sex.FEMALE && f.getBreast() > 80)
.mapToInt(f -> f.getBreast() + 1000)
.reduce(0, (x, y) -> x + y);
}
private static Map<Sex, List<MyFriends>> groupByGender(List<MyFriends> friend) {
return friend.stream()
.sorted((f1, f2) -> f1.getAge() - f2.getAge())
.collect(Collectors.groupingBy(f -> f.getGender()));
}
private static Map<String, List<MyFriends>> groupByBreastRank(List<MyFriends> friend) {
return friend.stream()
.filter(f -> f.getGender() == Sex.FEMALE)
.sorted((f1, f2) -> f1.getAge() - f2.getAge())
.collect(Collectors.groupingBy(f -> {
if (f.getBreast() > 85) {
return "< 巨乳>";
}
if (f.getBreast() > 75) {
return "< 乳 >";
}
if (f.getBreast() > 65) {
return "< 貧乳 >";
}
return "・・・";
}));
}
private static Map<Sex, Double> groupingBySexAndAve(List<MyFriends> friend) {
return friend.stream()
.collect(Collectors.groupingBy(MyFriends::getGender, Collectors.averagingInt(MyFriends::getAge)));
}
private static List<Sex> sortSexCount(List<MyFriends> friend) {
return friend.stream()
.collect(Collectors.groupingBy(MyFriends::getGender, Collectors.counting()))
.entrySet()
.stream()
.sorted(Comparator.comparingLong(Entry::getValue))
.map(Entry::getKey)
.collect(Collectors.toList());
}
private static List<Entry<Sex, Long>> sortSexCount2(List<MyFriends> friend) {
return friend.stream()
.collect(Collectors.groupingBy(MyFriends::getGender, Collectors.counting()))
.entrySet()
.stream()
.sorted(Comparator.comparingLong(Entry::getValue))
.collect(Collectors.toList());
}
}