package edu.pdx.cs410J.java8; import edu.pdx.cs410J.rmi.Movie; import java.util.*; import java.util.function.*; import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; public class StreamOperations { public void printElementsInStream() { Stream<String> stream = Arrays.asList("A", "B", "C").stream(); stream.forEach(new Consumer<String>() { @Override public void accept(String s) { System.out.println(s); } }); stream.forEach(System.out::println); } public void sumIntsUsingStream() { int[] ints = {1, 2, 3}; IntStream stream = IntStream.of(ints); long count = stream.count(); stream = IntStream.of(ints); long sum = stream.sum(); stream = IntStream.of(ints); IntSummaryStatistics stats = stream.summaryStatistics(); } public void findStringsWithMoreThanOneCharacter() { Stream<String> strings = Stream.of("A", "BB", "C", ""); Stream<String> moreThanTwoChars = strings.filter(new Predicate<String>() { @Override public boolean test(String s) { return s.length() > 1; } }); moreThanTwoChars = strings.filter(s -> s.length() > 1); } public void parseListOfStrings() { Stream<String> strings = Stream.of("1", "2", "3"); Stream<Integer> ints = strings.map(new Function<String, Integer>() { @Override public Integer apply(String s) { return Integer.parseInt(s); } }); IntStream stream = strings.mapToInt(Integer::parseInt); } public String getLongestString(Stream<String> strings) { Optional<String> longest = strings.max((s1, s2) -> s1.length() > s2.length() ? 1 : 0); return longest.orElse(""); } public Movie findMovieWithId(long id, Stream<Movie> movies) { Optional<Movie> movie = movies.filter(m -> m.getId() == id).findAny(); return movie.orElseThrow(() -> new IllegalArgumentException("Can't find movie")); } public long countMoviesWithActor(long actorId, Stream<Movie> movies) { return movies.parallel() .filter(m -> m.getActors().contains(actorId)) .count(); } public List<Movie> getMoviesWithActorUnsafe(long actorId, Stream<Movie> allMovies) { List<Movie> movies = new ArrayList<>(); allMovies.parallel() .filter(m -> m.getActors().contains(actorId)) .forEach(m -> movies.add(m)); return movies; } public List<Movie> getMoviesWithActorSafe(long actorId, Stream<Movie> allMovies) { return allMovies.parallel() .filter(m -> m.getActors().contains(actorId)) .collect(Collectors.toList()); } public int countAwardsForMoviesWithActor(long actorId, Stream<Movie> allMovies) { return allMovies.filter(m -> m.getActors().contains(actorId)) .map(m -> m.getNumberOfAwards()) .reduce(0, new BinaryOperator<Integer>() { @Override public Integer apply(Integer i1, Integer i2) { return i1 + i2; } }); } public String concatenateStrings(Stream<String> stream) { return stream.reduce("", (s1, s2) -> s1 + s2); } public String concatenateStrings2(Stream<String> stream) { Supplier<StringBuilder> supplier = () -> new StringBuilder(); BiConsumer<StringBuilder, StringBuilder> combiner = (sb1, sb2) -> sb1.append(sb2); BiConsumer<StringBuilder, String> accumulator = (sb, s) -> sb.append(s); StringBuilder sb = stream.collect(supplier, accumulator, combiner); return sb.toString(); } public String concatenateStrings3(Stream<String> stream) { return stream.collect(StringBuilder::new, StringBuilder::append, StringBuilder::append).toString(); } public String concatenateStrings4(Stream<String> stream) { return stream.collect(Collectors.joining()); } public SortedSet<String> getSortedStrings(Stream<String> stream) { return stream.collect(Collectors.toCollection(TreeSet::new)); } public double getAverageStringLength(Stream<String> stream) { return stream.collect(Collectors.averagingInt(s -> s.length())); } }