package com.insightfullogic.java8.examples.chapter5;
import com.insightfullogic.java8.examples.chapter1.Album;
import com.insightfullogic.java8.examples.chapter1.Artist;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*;
import java.util.function.Function;
import java.util.regex.Pattern;
import java.util.stream.Stream;
import static java.nio.charset.Charset.defaultCharset;
import static java.util.Comparator.comparing;
import static java.util.Map.Entry;
import static java.util.stream.Collectors.*;
public class CollectorExamples {
public void toCollectionTreeset() {
Stream<Integer> stream = Stream.of(1, 2, 3);
// BEGIN TO_COLLECTION_TREESET
stream.collect(toCollection(TreeSet::new));
// END TO_COLLECTION_TREESET
}
// BEGIN BIGGEST_GROUP
public Optional<Artist> biggestGroup(Stream<Artist> artists) {
Function<Artist,Long> getCount = artist -> artist.getMembers().count();
return artists.collect(maxBy(comparing(getCount)));
}
// END BIGGEST_GROUP
// BEGIN BANDS_AND_SOLO
public Map<Boolean, List<Artist>> bandsAndSolo(Stream<Artist> artists) {
return artists.collect(partitioningBy(artist -> artist.isSolo()));
}
// END BANDS_AND_SOLO
// BEGIN BANDS_AND_SOLO_REF
public Map<Boolean, List<Artist>> bandsAndSoloRef(Stream<Artist> artists) {
return artists.collect(partitioningBy(Artist::isSolo));
}
// END BANDS_AND_SOLO_REF
// BEGIN ALBUMS_BY_ARTIST
public Map<Artist, List<Album>> albumsByArtist(Stream<Album> albums) {
return albums.collect(groupingBy(album -> album.getMainMusician()));
}
// END ALBUMS_BY_ARTIST
public Map<Artist, Integer> numberOfAlbumsDumb(Stream<Album> albums) {
// BEGIN NUMBER_OF_ALBUMS_DUMB
Map<Artist, List<Album>> albumsByArtist
= albums.collect(groupingBy(album -> album.getMainMusician()));
Map<Artist, Integer> numberOfAlbums = new HashMap<>();
for(Entry<Artist, List<Album>> entry : albumsByArtist.entrySet()) {
numberOfAlbums.put(entry.getKey(), entry.getValue().size());
}
// END NUMBER_OF_ALBUMS_DUMB
return numberOfAlbums;
}
// BEGIN NUMBER_OF_ALBUMS
public Map<Artist, Long> numberOfAlbums(Stream<Album> albums) {
return albums.collect(groupingBy(album -> album.getMainMusician(),
counting()));
}
// END NUMBER_OF_ALBUMS
// BEGIN NAME_OF_ALBUMS_DUMB
public Map<Artist, List<String>> nameOfAlbumsDumb(Stream<Album> albums) {
Map<Artist, List<Album>> albumsByArtist =
albums.collect(groupingBy(album ->album.getMainMusician()));
Map<Artist, List<String>> nameOfAlbums = new HashMap<>();
for(Entry<Artist, List<Album>> entry : albumsByArtist.entrySet()) {
nameOfAlbums.put(entry.getKey(), entry.getValue()
.stream()
.map(Album::getName)
.collect(toList()));
}
return nameOfAlbums;
}
// END NAME_OF_ALBUMS_DUMB
// BEGIN NAME_OF_ALBUMS
public Map<Artist, List<String>> nameOfAlbums(Stream<Album> albums) {
return albums.collect(groupingBy(Album::getMainMusician,
mapping(Album::getName, toList())));
}
// END NAME_OF_ALBUMS
public static Map<String, Long> countWords(Stream<String> words) {
return words.collect(groupingBy(word -> word, counting()));
}
private static final Pattern SPACES = Pattern.compile("\\w+");
public static Map<String, Long> countWordsIn(Path path) throws IOException {
Stream<String> words = Files.readAllLines(path, defaultCharset())
.stream()
.flatMap(line -> SPACES.splitAsStream(line));
return countWords(words);
}
// BEGIN averagingTracks
public double averageNumberOfTracks(List<Album> albums) {
return albums.stream()
.collect(averagingInt(album -> album.getTrackList().size()));
}
// END averagingTracks
}