In Java 9, there are few useful methods introduced to java.util.stream.Stream.
- Stream.iterate – For loop with index. Equivalent for for (int i = 0; i < sortedNames.length; i++) {...}
- Stream.takeWhile – While loop takes value while condition is met
- Stream.dropWhile – While loop drops value while condition is met
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
package com.itsallbinary.java.java9; import java.util.Arrays; import java.util.Iterator; import java.util.stream.Collectors; import java.util.stream.Stream; public class StreamFeaturesJava9 { public static void main(String[] args) { String[] sortedNames = { "Amy", "Bob", "Chris", "Don", "Ravi", "Robert", "Zion" }; /** * For loop with Index. Print index of names startign with 'R' */ // Traditional for loop System.out.println("[Traditional for loop] Indexes of names starting with R = "); for (int i = 0; i < sortedNames.length; i++) { if (sortedNames[i].startsWith("R")) { System.out.println(i); } } // Stream.iterate alternative. Make sure to use ++i else it will loop infinite. System.out.println("[Stream.iterate] Indexes of names starting with R = "); Stream.iterate(0, i -> i < sortedNames.length, i -> ++i).filter(i -> sortedNames[i].startsWith("R")) .forEach(System.out::println); /* * While loop equivalent */ String namesAtoC = Arrays.stream(sortedNames).takeWhile(n -> n.charAt(0) <= 'C') .collect(Collectors.joining(",")); String namesDtoZ = Arrays.stream(sortedNames).dropWhile(n -> n.charAt(0) <= 'C') .collect(Collectors.joining(",")); System.out.println("Names A to C = " + namesAtoC); System.out.println("Names D to Z = " + namesDtoZ); } } |
Output
1 2 3 4 5 6 7 8 |
[Traditional for loop] Indexes of names starting with R = 4 5 [Stream.iterate] Indexes of names starting with R = 4 5 Names A to C = Amy,Bob,Chris Names D to Z = Don,Ravi,Robert,Zion |