-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFirstPartTasks.java
More file actions
86 lines (71 loc) · 4.4 KB
/
FirstPartTasks.java
File metadata and controls
86 lines (71 loc) · 4.4 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
package sp;
import java.util.*;
import java.util.function.Function;
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.flatMap(album -> album.getTracks().stream().map(Track::getName)).sorted().collect(Collectors.toList());
}
// Список альбомов, в которых есть хотя бы один трек с рейтингом более 95, отсортированный по названию
public static List<Album> sortedFavorites(Stream<Album> albums) {
return albums.filter(album -> album.getTracks().stream().anyMatch(track -> track.getRating() > 95))
.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(Function.<Album>identity(), Collectors.<Album>counting()))
.entrySet().stream().filter(entry -> entry.getValue() > 1).count();
}
// Альбом, в котором максимум рейтинга минимален
// (если в альбоме нет ни одного трека, считать, что максимум рейтинга в нем --- 0)
public static Optional<Album> minMaxRating(Stream<Album> albums) {
return albums.min(Comparator.comparing(album -> album.getTracks().stream()
.mapToInt(Track::getRating).max().orElse(0)));
}
// Список альбомов, отсортированный по убыванию среднего рейтинга его треков (0, если треков нет)
public static List<Album> sortByAverageRating(Stream<Album> albums) {
return albums.sorted(
Comparator.<Album, Double>comparing(album -> album
.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 s.filter(clazz::isInstance).map(clazz::cast);
}
}