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