93 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| title: Streams
 | |
| ---
 | |
| # Streams
 | |
| 
 | |
| In Java 8 Streams got added as a new feature the Java toolbox. Streams allow you to quickly and cleanly process Collections.  
 | |
| 
 | |
| Please read the chapter about lambdas and functional programming before continuing.
 | |
| 
 | |
| ## How it works
 | |
| The Stream loops the elements of the collection for you.
 | |
| Each intermediate and the terminal operation are called for each object.
 | |
| Once all operations are finished for the first objects, then the second object is loaded.
 | |
| 
 | |
| ## Important Methods
 | |
| ### Creation
 | |
| - `Collection.stream()`: create a Stream from any object from any class implementing `Collection`
 | |
| - `Arrays.stream(array)`: create a Stream from an Array
 | |
| 
 | |
| ### Intermediate Operations
 | |
| These operations convert the Stream Objects somehow.
 | |
| - `Stream.map(Function<In,Out> function)`: apply a Function to convert In to Out
 | |
| - `Stream.filter(Predicate<In> predicate)`: remove Objects from Stream for which the Predicate does not test true
 | |
| - `Stream.distinct()`: remove Objects from Stream which are duplicates
 | |
| - `Stream.sorted()`: sort the Objects in the Stream
 | |
| - `Stream.limit(int n)`: end Stream after n Objects
 | |
| 
 | |
| ### Terminal Operations
 | |
| These operations receive the Stream Objects and end the Stream.
 | |
| - `Stream.collect(Collector<In,?,Out> collector)`: collect all Objects in Stream into Object
 | |
| - `Stream.forEach(Consumer<In> consumer)`: consume all Objects in Stream using the consumer function
 | |
| - `Stream.count()`: count all Objects in Stream
 | |
| - `Stream.findFirst()`: return the first Object of the Stream and stop
 | |
| - `Stream.anyMatch(Predicate<In> predicate)`: return true if any Object in the Stream tests true for the Predicate
 | |
| - `Stream.allMatch(Predicate<In> predicate)`: return true if all Object in the Stream test true for the Predicate
 | |
| 
 | |
| ## Examples
 | |
| 
 | |
| ```java
 | |
| // print the length of all Strings in a List
 | |
| for (String string : Arrays.asList("abc", "de", "f", "abc")) {
 | |
|     int length = string.length();
 | |
|     System.out.println(length);
 | |
| }
 | |
| 
 | |
| Arrays.asList("abc", "de", "f", "abc")
 | |
|         .stream()
 | |
|         .map(String::length)
 | |
|         .forEach(System.out::println);
 | |
| 
 | |
| // output: 3 2 1 3
 | |
| ```
 | |
| 
 | |
| ```java
 | |
| // print all Strings in a List with a Length greater than 2
 | |
| for (String string : Arrays.asList("abc", "de", "f", "abc")) {
 | |
|     if (string.length() > 2) {
 | |
|         System.out.println(string);
 | |
|     }
 | |
| }
 | |
| 
 | |
| Arrays.asList("abc", "de", "f", "abc")
 | |
|         .stream()
 | |
|         .filter(string -> string.length() > 2)
 | |
|         .forEach(System.out::println);
 | |
| 
 | |
| // output: abc abc
 | |
| ```
 | |
| 
 | |
| ```java
 | |
| // create a sorted List with all unique Strings from another List which are longer than or requal 2
 | |
| List<String> result = new ArrayList<>();
 | |
| for (String string : Arrays.asList("de", "abc", "f", "abc")) {
 | |
|     if (string.length() >= 2
 | |
|             && ! result.contains(string)) {
 | |
|         result.add(string);
 | |
|     }
 | |
| }
 | |
| Collections.sort(result);
 | |
| 
 | |
| List<String> result2 = Arrays.asList("de", "abc", "f", "abc")
 | |
|         .stream()
 | |
|         .filter(string -> string.length() >= 2)
 | |
|         .distinct()
 | |
|         .sorted()
 | |
|         .collect(Collectors.toList());
 | |
| 
 | |
| // result: abc de
 | |
| ```
 | |
| 
 | |
| ### Sources
 | |
| 1. [Processing Data with Java SE 8 Streams, Part 1](http://www.oracle.com/technetwork/articles/java/ma14-java-se-8-streams-2177646.html)
 |