package com.insightfullogic.java8.examples.chapter3; import com.insightfullogic.java8.examples.chapter1.Track; import org.junit.Test; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.function.BinaryOperator; import java.util.stream.Collectors; import java.util.stream.Stream; import static java.lang.Character.isDigit; import static java.util.Arrays.asList; import static java.util.stream.Collectors.toList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; public class HigherOrderFunctionExamplesTest { @Test public void collectToList() { // BEGIN collect_to_list_1 List<String> collected = Stream.of("a", "b", "c") // <1> .collect(Collectors.toList()); // <2> assertEquals(Arrays.asList("a", "b", "c"), collected); // <3> // END collect_to_list_1 } @Test public void mapToUpperCase() { // BEGIN map_to_uppercase List<String> collected = Stream.of("a", "b", "hello") .map(string -> string.toUpperCase()) // <1> .collect(toList()); assertEquals(asList("A", "B", "HELLO"), collected); // END map_to_uppercase } @Test public void forToUpperCase() { // BEGIN for_to_uppercase List<String> collected = new ArrayList<>(); for (String string : asList("a", "b", "hello")) { String uppercaseString = string.toUpperCase(); collected.add(uppercaseString); } assertEquals(asList("A", "B", "HELLO"), collected); // END for_to_uppercase } @Test public void imperativeMaxLength() { // BEGIN imperativeMaxLength List<Track> tracks = asList(new Track("Bakai", 524), new Track("Violets for Your Furs", 378), new Track("Time Was", 451)); Track shortestTrack = tracks.get(0); for (Track track : tracks) { if (track.getLength() < shortestTrack.getLength()) { shortestTrack = track; } } assertEquals(tracks.get(1), shortestTrack); // END imperativeMaxLength } @Test public void streamsMaxLength() { // BEGIN streamsMaxLength List<Track> tracks = asList(new Track("Bakai", 524), new Track("Violets for Your Furs", 378), new Track("Time Was", 451)); Track shortestTrack = tracks.stream() .min(Comparator.comparing(track -> track.getLength())) .get(); assertEquals(tracks.get(1), shortestTrack); // END streamsMaxLength } @Test public void streamsAnyMatch() { // BEGIN streamsAnyMatch List<Track> tracksOnColtrane = asList(new Track("Bakai", 524), new Track("Violets for Your Furs", 378), new Track("Time Was", 451)); boolean matchLength = tracksOnColtrane.stream() .anyMatch(track -> track.getLength() > 500); assertTrue(matchLength); // END streamsAnyMatch } @Test public void imperativeAnyMatch() { // BEGIN imperativeAnyMatch List<Track> tracksOnColtrane = asList(new Track("Bakai", 524), new Track("Violets for Your Furs", 378), new Track("Time Was", 451)); boolean matchLength = false; for(Track track : tracksOnColtrane) { if (track.getLength() > 500) { matchLength = true; } } assertTrue(matchLength); // END imperativeAnyMatch } @Test public void sumUsingReduce() { // BEGIN count_using_reduce int count = Stream.of(1, 2, 3) .reduce(0, (acc, element) -> acc + element); assertEquals(6, count); // END count_using_reduce } @Test public void expandedReduce() { // BEGIN expanded_reduce BinaryOperator<Integer> accumulator = (acc, element) -> acc + element; int count = accumulator.apply( accumulator.apply( accumulator.apply(0, 1), 2), 3); // END expanded_reduce assertEquals(6, count); } @Test public void countUsingReduceFor() { // BEGIN count_using_reduce_for int acc = 0; for (Integer element : asList(1, 2, 3)) { acc = acc + element; } assertEquals(6, acc); // END count_using_reduce_for } @Test public void functionalStringsWithNumbers() { // BEGIN strings_numbers_filter List<String> beginningWithNumbers = Stream.of("a", "1abc", "abc1") .filter(value -> isDigit(value.charAt(0))) .collect(toList()); assertEquals(asList("1abc"), beginningWithNumbers); // END strings_numbers_filter } @Test public void imperativeStringsWithNumbers() { // BEGIN strings_numbers_for List<String> beginningWithNumbers = new ArrayList<>(); for(String value : asList("a", "1abc", "abc1")) { if (isDigit(value.charAt(0))) { beginningWithNumbers.add(value); } } assertEquals(asList("1abc"), beginningWithNumbers); // END strings_numbers_for } @Test public void flatMapCharacters() { // BEGIN flatmap_characters List<Integer> together = Stream.of(asList(1, 2), asList(3, 4)) .flatMap(numbers -> numbers.stream()) .collect(toList()); assertEquals(asList(1, 2, 3, 4), together); // END flatmap_characters } }