--- title: Streams localeTitle: 流 --- # 流 在Java 8中,Streams被添加为Java工具箱的新功能。 Streams允许您快速,干净地处理集合。 在继续之前,请阅读有关lambdas和函数式编程的章节。 ## 怎么运行的 Stream为您循环集合的元素。 为每个对象调用每个中间和终端操作。 完成第一个对象的所有操作后,将加载第二个对象。 ## 重要方法 ### 创建 * `Collection.stream()` :从任何实现`Collection`类中的任何对象创建一个Stream * `Arrays.stream(array)` :从Array创建一个Stream ### 中级操作 这些操作以某种方式转换流对象。 * `Stream.map(Function function)` :应用函数将In转换为Out * `Stream.filter(Predicate predicate)` :从Stream中删除对象,谓词不测试为true * `Stream.distinct()` :从Stream中删除重复的对象 * `Stream.sorted()` :对Stream中的对象进行排序 * `Stream.limit(int n)` :在n个对象之后的end `Stream.limit(int n)` ### 终端操作 这些操作接收流对象并结束流。 * `Stream.collect(Collector collector)` :将Stream中的所有对象收集到Object中 * `Stream.forEach(Consumer consumer)` :使用使用者函数使用Stream中的所有对象 * `Stream.count()` :计算Stream中的所有对象 * `Stream.findFirst()` :返回Stream的第一个Object并停止 * `Stream.anyMatch(Predicate predicate)` :如果Stream中的任何Object对Predicate测试为true,则返回true * `Stream.allMatch(Predicate predicate)` :如果Stream中的所有Object对Predicate测试为true,则返回true ## 例子 ```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 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 result2 = Arrays.asList("de", "abc", "f", "abc") .stream() .filter(string -> string.length() >= 2) .distinct() .sorted() .collect(Collectors.toList()); // result: abc de ``` ### 来源 1. [使用Java SE 8 Streams处理数据,第1部分](http://www.oracle.com/technetwork/articles/java/ma14-java-se-8-streams-2177646.html)