/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.insightfullogic.java8.examples.chapter1; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.stream.Stream; import static java.util.Collections.unmodifiableList; import static java.util.stream.Collectors.toList; /** * * @author richard */ public final class Album implements Performance { private String name; private List<Track> tracks; private List<Artist> musicians; public Album(String name, List<Track> tracks, List<Artist> musicians) { Objects.requireNonNull(name); Objects.requireNonNull(tracks); Objects.requireNonNull(musicians); this.name = name; this.tracks = new ArrayList<>(tracks); this.musicians = new ArrayList<>(musicians); } /** * @return the name */ public String getName() { return name; } /** * @return the tracks */ public Stream<Track> getTracks() { return tracks.stream(); } /** * Used in imperative code examples that need to iterate over a list */ public List<Track> getTrackList() { return unmodifiableList(tracks); } /** * @return the musicians */ public Stream<Artist> getMusicians() { return musicians.stream(); } /** * Used in imperative code examples that need to iterate over a list */ public List<Artist> getMusicianList() { return unmodifiableList(musicians); } public Artist getMainMusician() { return musicians.get(0); } public Album copy() { List<Track> tracks = getTracks().map(Track::copy).collect(toList()); List<Artist> musicians = getMusicians().map(Artist::copy).collect(toList()); return new Album(name, tracks, musicians); } }