Java05. ДЗ 05, Кравцун Андрей#80
Conversation
sproshev
left a comment
There was a problem hiding this comment.
надо исправлять, это задание не такое сложное, как оно написано
| // Список треков, отсортированный лексикографически по названию, включающий все треки альбомов из 'albums' | ||
| public static List<String> allTracksSorted(Stream<Album> albums) { | ||
| throw new UnsupportedOperationException(); | ||
| Stream<Album> sortedAlbums = albums.sorted(Comparator.comparing(Album::getName)); |
| (Album album) -> album.getTracks().stream().map(track -> { | ||
| return track.getName(); | ||
| }); | ||
| return sortedAlbums.flatMap(getTracksOfAlbum).sorted(String::compareTo).collect(Collectors.toList()); |
There was a problem hiding this comment.
т.к. строки наследуются от Comparable, то в sorted ничего передавать не надо
| (Album album) -> album.getTracks().stream().map(track -> { | ||
| return track.getName(); | ||
| }); | ||
| return sortedAlbums.flatMap(getTracksOfAlbum).sorted(String::compareTo).collect(Collectors.toList()); |
There was a problem hiding this comment.
этот flatMap может быть представлен в виде цепочки flatMap/map, т.ч. никаких переменных не потребуется
в целом это применимо ко всем методам в этом классе
| Collector.of(listSupplier, listAccumulator, listStringCombiner); | ||
| Collector<Album, ?, Map<Artist, List<String>>> groupingCollector = | ||
| Collectors.groupingBy(a -> a.getArtist(), albumToStringList); | ||
| return albums.collect(groupingCollector); |
There was a problem hiding this comment.
чересчур, достаточно скомбинировать Collectors.groupingBy, Collectors.mapping и Collectors.toList
| public static long countAlbumDuplicates(Stream<Album> albums) { | ||
| throw new UnsupportedOperationException(); | ||
| Collector<Album, ?, Map<Album, Integer>> counter = | ||
| Collectors.groupingBy(a -> a, Collectors.summingInt(a -> 1)); |
| String name = stringListEntry.getKey(); | ||
| Integer length = stringListEntry.getValue().stream() | ||
| .mapToInt(String::length) | ||
| .reduce(0, (l, r) -> l + r); |
| Integer length = stringListEntry.getValue().stream() | ||
| .mapToInt(String::length) | ||
| .reduce(0, (l, r) -> l + r); | ||
| return new Pair(name, length); |
| , "src/main/java/ru/spbau/mit/FirstPartTasks.java" | ||
| , "src/main/java/ru/spbau/mit/SecondPartTasks.java" | ||
| ); | ||
| assertEquals(Arrays.asList(), findQuotes(files, (CharSequence) "qaef2wefadsf")); |
There was a problem hiding this comment.
Collections.emptyList(), уже говорил про него -0.25
| , "src/main/java/ru/spbau/mit/SecondPartTasks.java" | ||
| ); | ||
| assertEquals(Arrays.asList(), findQuotes(files, (CharSequence) "qaef2wefadsf")); | ||
| List<String> v = findQuotes(files, (CharSequence) "String name"); |
| , " private final String name;" | ||
| , " Track(String name, int rating) {" | ||
| , " String name = stringListEntry.getKey();") | ||
| , findQuotes(files, (CharSequence) "String name")); |
There was a problem hiding this comment.
к чему здесь постоянный каст к CharSequence?
| Function.identity(), | ||
| Collectors.counting() | ||
| )); | ||
| Stream<Long> sameCounts = albumsCount.entrySet().stream().map(e -> e.getValue() - 1); |
There was a problem hiding this comment.
можно здесь сделать mapToInt в конце, потом остается только sum вызвать
There was a problem hiding this comment.
Т.е. это common guideline, что в Java в стримах лучше всё в одну строку делать? Вроде же не интерпретируемый язык.
There was a problem hiding this comment.
как это связано?)
в одну строку может быть и не стоит (т.к. если цепочка преобразований достаточно длинная, то читаемость заметно падает), но в одно выражение весьма удобно это оформлять.
list.stream().map(...).filter(...).map(...).mapToInt(...) // одна строка и одно выражение
list
.stream()
.map(...)
.filter(...)
.map(...)
.mapToInt(...) // несколько строк, но до сих пор одно выражение, я обычно так пишу
одно выражение удобно читать, т.к. последовательность вызовов соответствует тому, что будет происходить в действительности, поэтому код читается за один проход)
@sproshev