Wednesday, August 30, 2017

Java 8 Streams flatMap()

In Java 8 Stream API, flatMap() method is an intermediate functions for streams, in that, it will produce a final result but used to apply transformations on the elements of a Stream. It is possible to to chain multiple flatMap() while processing a single stream. Both map() and flatMap() both can be applied to a Stream<T> and return a Stream<R> or transformed elements, but the main difference is that map() produces one output element for each input element, whereas flatMap() produces any number (0-n) of output elements for each input element. Put simply, when using a map(), the resulting stream would have same number or elements as the input stream, where as it can be different in case of a flatMap(). The following example illustrates the differences the use of flatMap()

flatMap() with Lists and Sets

flatMap() can be used to convert List<List<T>> to List<T> or Set<Set<T>> to Set<T>. Here we see an example which applies flatMap() on List<List<String>> to result in List<String>.
List<List<String>> input = Arrays.asList(Arrays.asList("T", "h", "i", "s"), Arrays.asList("i", "s"),
                    Arrays.asList("J", "a", "v", "a", "8"), Arrays.asList("S", "t", "r", "e", "a", "m"),
                    Arrays.asList("f", "l", "a", "t", "M", "a", "p", "(", ")"),
                    Arrays.asList("E", "x", "a", "m", "p", "l", "e"));
input.stream().flatMap(list -> list.stream()).forEach(System.out::println);

flatMap() with Arrays

Integer[][] pie = {{3,1},{4,1},{5,6}};
Arrays.stream(pie).flatMap(num < Arrays.stream(num)).
forEach(System.out::println);

Print Words in a text file using flatMap()

Here we see a way to read lines from a text file using Files.Lines() method to get a Stream of lines and apply flatMap() to split the words in the line and print.
Files.lines(Paths.get("C:/test/test.txt")).flatMap(x->Arrays.stream(x.split(" "))).forEach(System.out::println);
Here is the full file with all three examples
package streams;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;

public class StreamFlatMapTest {

 public static void main(String[] args) {
  List<List<String>> input = Arrays.asList(Arrays.asList("T", "h", "i", "s"), Arrays.asList("i", "s"),
    Arrays.asList("J", "a", "v", "a", "8"), Arrays.asList("S", "t", "r", "e", "a", "m"),
    Arrays.asList("f", "l", "a", "t", "M", "a", "p", "(", ")"),
    Arrays.asList("E", "x", "a", "m", "p", "l", "e"));
  input.stream().flatMap(list -> list.stream()).forEach(System.out::println);
  
  
  Integer[][] pie = {{3,1},{4,1},{5,6}};
  Arrays.stream(pie).flatMap(num -> Arrays.stream(num)).
  forEach(System.out::println);
  
  try {
   Files.lines(Paths.get("C:/test/test.txt")).flatMap(x->Arrays.stream(x.split(" "))).forEach(System.out::println);
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}

No comments:

Post a Comment

Popular Posts