Repository navigation
Expand file tree
/
Copy pathMain.java
More file actions
152 lines (118 loc) · 6.74 KB
/
Copy pathMain.java
File metadata and controls
152 lines (118 loc) · 6.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
package modern.challenge;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import static java.util.Comparator.comparingInt;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Random;
import java.util.Set;
import java.util.TreeMap;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.IntFunction;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.mapping;
import static java.util.stream.Collectors.maxBy;
import static java.util.stream.Collectors.minBy;
import static java.util.stream.Collectors.toSet;
import modern.challenge.Melon.Sugar;
import static modern.challenge.Melon.Sugar.HIGH;
import static modern.challenge.Melon.Sugar.LOW;
import static modern.challenge.Melon.Sugar.MEDIUM;
public class Main {
public static void main(String[] args) {
List<Melon> melons = Arrays.asList(new Melon("Crenshaw", 1200),
new Melon("Gac", 3000), new Melon("Hemi", 2600),
new Melon("Hemi", 1600), new Melon("Gac", 1200),
new Melon("Apollo", 2600), new Melon("Horned", 1700),
new Melon("Gac", 3000), new Melon("Hemi", 2600)
);
Map<String, List<Melon>> byTypeInList = melons.stream()
.collect(groupingBy(Melon::getType));
Map<Integer, List<Melon>> byWeightInList = melons.stream()
.collect(groupingBy(Melon::getWeight));
System.out.println("Melons grouped by type with duplicates:\n" + byTypeInList);
System.out.println("\nMelons grouped by weight with duplicates:\n" + byWeightInList);
Map<String, Set<Melon>> byTypeInSet = melons.stream()
.collect(groupingBy(Melon::getType, toSet()));
Map<Integer, Set<Melon>> byWeightInSet = melons.stream()
.collect(groupingBy(Melon::getWeight, toSet()));
System.out.println("\nMelons grouped by type without duplicates:\n" + byTypeInSet);
System.out.println("\nMelons grouped by weight without duplicates:\n" + byWeightInSet);
Map<Integer, Set<Melon>> byWeightInSetOrdered1 = melons.stream()
.collect(groupingBy(Melon::getWeight, TreeMap::new, toSet()));
Map<Integer, Set<String>> byWeightInSetOrdered2 = melons.stream()
.collect(groupingBy(Melon::getWeight, TreeMap::new,
mapping(Melon::getType, toSet())));
System.out.println("\nMelons grouped and ordered by "
+ "weight without duplicates:\n" + byWeightInSetOrdered1);
System.out.println("\nTypes of melons grouped and ordered "
+ "by weight without duplicates:\n" + byWeightInSetOrdered2);
Map<Integer, Long> weightsCount = melons.stream()
.collect(groupingBy(Melon::getWeight, counting()));
Map<String, Long> typesCount = melons.stream()
.collect(groupingBy(Melon::getType, counting()));
System.out.println("\nGroup melons by type and count:\n" + typesCount);
System.out.println("\nGroup melons by weight and count:\n" + weightsCount);
Map<String, Optional<Melon>> minMelonByType1 = melons.stream()
.collect(groupingBy(Melon::getType, minBy(comparingInt(Melon::getWeight))));
Map<String, Optional<Melon>> maxMelonByType1 = melons.stream()
.collect(groupingBy(Melon::getType, maxBy(comparingInt(Melon::getWeight))));
System.out.println("\nLightest melons by type:\n" + minMelonByType1);
System.out.println("\nHeaviest melons by type:\n" + maxMelonByType1);
Map<String, Integer> minMelonByType2 = melons.stream()
.collect(groupingBy(Melon::getType,
collectingAndThen(minBy(comparingInt(Melon::getWeight)),
m -> m.orElseThrow().getWeight())));
Map<String, Integer> maxMelonByType2 = melons.stream()
.collect(groupingBy(Melon::getType,
collectingAndThen(maxBy(comparingInt(Melon::getWeight)),
m -> m.orElseThrow().getWeight())));
System.out.println("\nLightest weight by type:\n" + minMelonByType2);
System.out.println("\nHeaviest weight by type:\n" + maxMelonByType2);
Map<String, Melon[]> byTypeArray = melons.stream()
.collect(groupingBy(Melon::getType, collectingAndThen(
Collectors.toList(), l -> l.toArray(Melon[]::new))));
// Map<String, Melon[]> byTypeArray = melons.stream()
// .collect(groupingBy(Melon::getType, toArray(Melon[]::new)));
System.out.println();
byTypeArray.forEach((t, m) -> {
System.out.println("Melon type: " + t);
System.out.println("Array of melons of this type: " + Arrays.toString(m));
});
List<Melon> melonsSugar = Arrays.asList(new Melon("Crenshaw", 1200, HIGH),
new Melon("Gac", 3000, LOW), new Melon("Hemi", 2600, HIGH),
new Melon("Hemi", 1600), new Melon("Gac", 1200, LOW),
new Melon("Cantaloupe", 2600, MEDIUM), new Melon("Cantaloupe", 3600, MEDIUM),
new Melon("Apollo", 2600, MEDIUM), new Melon("Horned", 1200, HIGH),
new Melon("Gac", 3000, LOW), new Melon("Hemi", 2600, HIGH)
);
Map<Sugar, Map<Integer, Set<String>>> bySugarAndWeight = melonsSugar.stream()
.collect(groupingBy(Melon::getSugar,
groupingBy(Melon::getWeight, TreeMap::new,
mapping(Melon::getType, toSet()))));
System.out.println("\nTypes of melon grouped by sugar level and weights:\n" + bySugarAndWeight);
System.out.println("\nSplit a list of 100 weights in multiple 10 lists of 10 elements each");
Random rnd = new Random();
List<Integer> allWeights = new ArrayList<>(100);
for (int i = 0; i < 100; i++) {
allWeights.add(1000 + rnd.nextInt(6000));
}
System.out.println("\nAll weights:\n" + allWeights);
final AtomicInteger count = new AtomicInteger();
Collection<List<Integer>> chunkWeights = allWeights.stream()
.collect(Collectors.groupingBy(c -> count.getAndIncrement() / 10))
.values();
System.out.println("\nAll chunks: ");
chunkWeights.forEach(System.out::println);
}
private static <T> Collector<T, ?, T[]> toArray(IntFunction<T[]> func) {
return Collectors.collectingAndThen(
Collectors.toList(), l -> l.toArray(func.apply(l.size())));
}
}