首先要说的是,不要被它的名称骗了,这里的Stream跟JAVA I/O中的InputStream和OutputStream是两个不一样的概念。Java 8中的Stream实际上是函数式编程里Monad的概念,关于Monad,感受仍是比较抽象,很差理解,能够参考这篇文章,我的以为仍是比较好看懂的,简单说,Monad就是一种设计模式,表示将一个运算过程,经过函数拆解成互相链接的多个步骤,有点链式操做的感受。html
以下,是一个Stream的例子java
import java.util.Arrays; import java.util.List; public class Snippet { public static void main(String[] args) { List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1"); myList .stream() .filter(s -> s.startsWith("c")) //过滤以c字母开头 .map(String::toUpperCase) //字符变成大写 .sorted() //排序 .forEach(System.out::println); //打印输出 } }
Stream有两种类型的操做:Intermediate操做和Terminal操做。编程
Stream能够进行屡次的Intermediate操做,如前面开头的那个例子,其中filter、map、sorted都是Intermediate操做,注意该操做是惰性化的,当调用到该方法的时候,并无真正开始Stream的遍历。设计模式
一个Stream只有一个Terminal操做,如前面开头的那个例子,其中forEach就是Terminal操做,Terminal操做是Stream的最后一个操做,这时候才会开始Stream的遍历。api
使用Stream.of数组
import java.util.stream.Stream; public class StreamBuilders { public static void main(String[] args) { Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9); stream.forEach(p -> System.out.println(p)); } }
使用Arrays.stream数据结构
import java.util.Arrays; import java.util.stream.Stream; public class StreamBuilders { public static void main(String[] args) { Stream<Integer> stream = Arrays.stream(new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9}); stream.forEach(p -> System.out.println(p)); } }
使用Collection.stream() or Collection.parallelStream()多线程
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Stream; public class StreamBuilders { public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(Arrays.asList(new Integer[]{ 1, 2, 3, 4, 5, 6, 7, 8, 9 })); Stream<Integer> stream = list.stream(); //or list.parallelStream(); stream.forEach(p -> System.out.println(p)); } }
使用IntStream.range并发
import java.util.stream.IntStream; public class StreamBuilders { public static void main(String[] args) { IntStream stream = IntStream.range(1, 9); stream.forEach(p -> System.out.println(p)); } }
使用Random.ints()框架
import java.util.Random; import java.util.stream.IntStream; public class StreamBuilders { public static void main(String[] args) { IntStream stream = new Random().ints(1, 10); stream.forEach(p -> System.out.println(p)); } }
使用Stream.generate()
import java.util.concurrent.TimeUnit; import java.util.stream.Stream; public class StreamBuilders { static int i = 0; public static void main(String[] args) { Stream<Integer> stream = Stream.generate(() -> { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } return i++; }); stream.forEach(p -> System.out.println(p)); } }
其它还有不少,这里暂不一一列出。
使用stream.collect(Collectors.toList())
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; public class StreamBuilders { public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(Arrays.asList(new Integer[]{ 1, 2, 3, 4, 5, 6, 7, 8, 9 })); Stream<Integer> stream = list.stream(); List<Integer> evenNumbersList = stream.filter(i -> i % 2 == 0).collect(Collectors.toList()); System.out.print(evenNumbersList); } }
使用stream.toArray(EntryType[]::new)
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Stream; public class StreamBuilders { public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(Arrays.asList(new Integer[]{ 1, 2, 3, 4, 5, 6, 7, 8, 9 })); Stream<Integer> stream = list.stream(); Integer[] evenNumbersArr = stream.filter(i -> i % 2 == 0).toArray(Integer[]::new); System.out.print(Arrays.asList(evenNumbersArr)); } }
其它转为set,map的相似,不一一列出。
Intermediate(中间操做),这里只列出常见的几个
filter方法,过滤元素
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Stream; public class StreamBuilders { public static void main(String[] args) { List<String> list = new ArrayList<String>(Arrays.asList(new String[]{ "Amitabh", "Shekhar", "Aman", "Rahul", "Shahrukh", "Salman", "Yana", "Lokesh"})); Stream<String> stream = list.stream(); stream.filter((s) -> s.startsWith("A")).forEach(System.out::println); } }
map方法,修改元素
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Stream; public class StreamBuilders { public static void main(String[] args) { List<String> list = new ArrayList<String>(Arrays.asList(new String[]{ "Amitabh", "Shekhar", "Aman", "Rahul", "Shahrukh", "Salman", "Yana", "Lokesh"})); Stream<String> stream = list.stream(); stream.filter((s) -> s.startsWith("A")).map(String::toUpperCase).forEach(System.out::println); } }
sorted方法,排序,能够传入自定义排序接口Comparator,
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Stream; public class StreamBuilders { public static void main(String[] args) { List<String> list = new ArrayList<String>(Arrays.asList(new String[]{ "Amitabh", "Shekhar", "Aman", "Rahul", "Shahrukh", "Salman", "Yana", "Lokesh"})); Stream<String> stream = list.stream(); stream.sorted().map(String::toUpperCase).forEach(System.out::println); } }
Terminal(结束操做),这里只列出常见的几个
这里的例与前面的相似,就不写出所有代码了,列出重要部分。
forEach方法,迭代元素,并执行相关操做
stream.sorted().map(String::toUpperCase).forEach(System.out::println);
collect方法,从Stream中获得集合
List<String> memNamesInUppercase = stream.sorted().map(String::toUpperCase).collect(Collectors.toList());
System.out.print(memNamesInUppercase);
Match方法,匹配判断Stream中的元素是否符合指定规则
boolean matchedResult = list.stream().anyMatch((s) -> s.startsWith("A")); System.out.println(matchedResult); matchedResult = list.stream().allMatch((s) -> s.startsWith("A")); System.out.println(matchedResult); matchedResult = list.stream().noneMatch((s) -> s.startsWith("A")); System.out.println(matchedResult);
count方法,计数
long totalMatched = list.stream().filter((s) -> s.startsWith("A")).count(); System.out.println(totalMatched);
reduce方法,元素组合操做,经常使用于字符串拼接、数值的 sum、min、max、average
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Optional; public class StreamBuilders { public static void main(String[] args) { List<String> list = new ArrayList<String>(Arrays.asList(new String[]{ "Amitabh", "Shekhar", "Aman", "Rahul", "Shahrukh", "Salman", "Yana", "Lokesh"})); Optional<String> reduced = list.stream().reduce((s1, s2) -> s1 + "#" + s2); reduced.ifPresent(System.out::println); //打印结果:Amitabh#Shekhar#Aman#Rahul#Shahrukh#Salman#Yana#Lokesh } }
所谓的短路操做。指的是若是符合要求的话,就不继续执行接下来的操做,相似于&&和||操做,
在Stream中,相似的有anyMatch()和findFirst()方法,
anyMatch(),返回布尔值,只要找到一个匹配的元素,就中止接下来的元素遍历;
boolean matched = list.stream().anyMatch((s) -> s.startsWith("A")); System.out.println(matched); // Output: true
findFirst(),返回元素,一样,只返回第一个元素,不会所有遍历;
String firstMatchedName = list.stream().filter((s) -> s.startsWith("L")).findFirst().get(); System.out.println(firstMatchedName); // Output: Lokesh
Java 7引入了Fork/Join并行计算框架,能让咱们以并行方式来拆分任务和加速处理过程。一般编写并行代码很难并且容易出错, 但使用 Stream API 无需编写一行多线程的代码,就能够很方便地写出高性能的并发程序。
以下示例:
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Stream; public class StreamBuilders { public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(Arrays.asList(new Integer[]{ 1, 2, 3, 4, 5, 6, 7, 8, 9 })); // Here creating a parallel stream Stream<Integer> stream = list.parallelStream(); Integer[] evenNumbersArr = stream.filter(i -> i % 2 == 0).toArray(Integer[]::new); System.out.print(Arrays.asList(evenNumbersArr)); } }
下面给出一个使用Stream与不使用Stream示例,用于统计字符长度为3的字符串个数。
import java.util.Arrays; import java.util.List; public class Java8Tester { public static void main(String args[]){ List<String> strings = Arrays.asList("abc", "111", "bc", "efg", "12584","", "1254"); //使用Java 7, 统计字符长度为3的字符串个数 long count = 0; for(String string: strings){ if(string.length() == 3){ count++; } } System.out.println("using java7:Strings of length 3: " + count); //使用Java 8的stream, 统计字符长度为3的字符串个数 count = strings.stream().filter(string -> string.length() == 3).count(); System.out.println("using java8:Strings of length 3: " + count); } }
http://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/
http://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/
https://www.tutorialspoint.com/java8/java8_streams.htm
http://howtodoinjava.com/core-java/collections/java-8-tutorial-streams-by-examples/