package com.insightfullogic.java8.examples.chapter5; import com.insightfullogic.java8.examples.chapter1.Album; import com.insightfullogic.java8.examples.chapter1.Artist; import java.util.HashMap; import java.util.List; import java.util.Map; public class Niceties { abstract class ArtistService { protected Map<String, Artist> artistCache = new HashMap<>(); public abstract Artist getArtist(String name); protected Artist readArtistFromDB(String name) { return new Artist(name, "UK"); } } class OldArtistService extends ArtistService { // BEGIN ARTIST_CACHE_OLD public Artist getArtist(String name) { Artist artist = artistCache.get(name); if (artist == null) { artist = readArtistFromDB(name); artistCache.put(name, artist); } return artist; } // END ARTIST_CACHE_OLD } class Java8ArtistService extends ArtistService { // BEGIN ARTIST_CACHE_COMPUTE public Artist getArtist(String name) { return artistCache.computeIfAbsent(name, this::readArtistFromDB); } // END ARTIST_CACHE_COMPUTE } class ImperativeCount { public Map<Artist, Integer> countAlbums(Map<Artist, List<Album>> albumsByArtist) { // BEGIN COUNT_ALBUMS_VALUES_UGLY Map<Artist, Integer> countOfAlbums = new HashMap<>(); for(Map.Entry<Artist, List<Album>> entry : albumsByArtist.entrySet()) { Artist artist = entry.getKey(); List<Album> albums = entry.getValue(); countOfAlbums.put(artist, albums.size()); } // END COUNT_ALBUMS_VALUES_UGLY return countOfAlbums; } } class Java8Count { public Map<Artist, Integer> countAlbums(Map<Artist, List<Album>> albumsByArtist) { // BEGIN COUNT_ALBUMS_VALUES_FOREACH Map<Artist, Integer> countOfAlbums = new HashMap<>(); albumsByArtist.forEach((artist, albums) -> { countOfAlbums.put(artist, albums.size()); }); // END COUNT_ALBUMS_VALUES_FOREACH return countOfAlbums; } } }