package com.insightfullogic.java8.examples.chapter3;
import com.insightfullogic.java8.examples.chapter1.Artist;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Stream;
public class StreamExercises {
// Q3
public static int countBandMembersExternal(List<Artist> artists) {
// BEGIN COUNT_MEMBERS_EXTERNAL
int totalMembers = 0;
for (Artist artist : artists) {
Stream<Artist> members = artist.getMembers();
totalMembers += members.count();
}
// END COUNT_MEMBERS_EXTERNAL
return totalMembers;
}
// map f = foldr ((:) . f) []
// Advanced Exercise
public static <T, R> List<R> map(Stream<T> stream, Function<T, R> mapper) {
return stream.reduce(new ArrayList<>(), (acc, value) -> {
// Make copy of list (modifying acc would violate contract of reduce method)
ArrayList<R> result = new ArrayList<>();
result.addAll(acc);
result.add(mapper.apply(value));
return result;
}, (left, right) -> {
ArrayList<R> result = new ArrayList<>();
result.addAll(left);
result.addAll(right);
return result;
});
}
}