-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFirstPartTasks.java
More file actions
113 lines (98 loc) · 4.96 KB
/
FirstPartTasks.java
File metadata and controls
113 lines (98 loc) · 4.96 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
package sp;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
public final class FirstPartTasks {
private FirstPartTasks() {}
// Список названий альбомов
public static List<String> allNames(Stream<Album> albums) {
return albums.map(Album::getName).collect(Collectors.toList());
}
// Список названий альбомов, отсортированный лексикографически по названию
public static List<String> allNamesSorted(Stream<Album> albums) {
return albums
.map(Album::getName)
.sorted()
.collect(Collectors.toList());
}
// Список треков, отсортированный лексикографически по названию, включающий все треки альбомов из 'albums'
public static List<String> allTracksSorted(Stream<Album> albums) {
return albums
.map(Album::getTracks)
.flatMap(List::stream)
.map(Track::getName)
.sorted()
.collect(Collectors.toList());
}
// Список альбомов, в которых есть хотя бы один трек с рейтингом более 95, отсортированный по названию
public static List<Album> sortedFavorites(Stream<Album> albums) {
return albums
.filter(album -> album
.getTracks()
.stream()
.filter(track -> track.getRating() > 95)
.count() > 0)
.sorted(Comparator.comparing(Album::getName))
.collect(Collectors.toList());
}
// Сгруппировать альбомы по артистам
public static Map<Artist, List<Album>> groupByArtist(Stream<Album> albums) {
return albums
.collect(Collectors.groupingBy(Album::getArtist));
}
// Сгруппировать альбомы по артистам (в качестве значения вместо объекта 'Artist' использовать его имя)
public static Map<Artist, List<String>> groupByArtistMapName(Stream<Album> albums) {
return albums
.collect(Collectors.groupingBy(
Album::getArtist,
Collectors.mapping(
Album::getName,
Collectors.toList())));
}
// Число повторяющихся альбомов в потоке
public static long countAlbumDuplicates(Stream<Album> albums) {
return albums
.collect(Collectors.groupingBy(a -> a))
.values()
.stream()
.filter(l -> l.size() > 1)
.count();
}
// Альбом, в котором максимум рейтинга минимален
// (если в альбоме нет ни одного трека, считать, что максимум рейтинга в нем --- 0)
public static Optional<Album> minMaxRating(Stream<Album> albums) {
return albums
.min(Comparator.comparingInt(a -> a
.getTracks()
.stream()
.map(Track::getRating)
.max(Comparator.naturalOrder())
.orElse(0)));
}
// Список альбомов, отсортированный по убыванию среднего рейтинга его треков (0, если треков нет)
public static List<Album> sortByAverageRating(Stream<Album> albums) {
return albums
.sorted(Comparator.comparingDouble((Album a) -> a
.getTracks()
.stream()
.mapToInt(Track::getRating)
.average().orElse(0)).reversed())
.collect(Collectors.toList());
}
// Произведение всех чисел потока по модулю 'modulo'
// (все числа от 0 до 10000)
public static int moduloProduction(IntStream stream, int modulo) {
return stream.reduce(1, (a, b) -> a * b % modulo);
}
// Вернуть строку, состояющую из конкатенаций переданного массива, и окруженную строками "<", ">"
// см. тесты
public static String joinTo(String... strings) {
return Arrays.stream(strings)
.collect(Collectors.joining(", ", "<", ">"));
}
// Вернуть поток из объектов класса 'clazz'
public static <R> Stream<R> filterIsInstance(Stream<?> s, Class<R> clazz) {
return (Stream<R>) s.filter(o -> clazz.isAssignableFrom(o.getClass()));
}
}