Java8新特性——流接口Streams

今天是高考的日子,是大四师兄师姐答辩毕业的日子。一代又来,一代又去。好久没写博客,借此特殊日子整理一下前不久学java8新特性时写的代码,留下痕迹。(本博客的代码根据 java8新特性教程 学习整理,加上个人的理解而成,关于某个新特性的介绍代码里的注释已经阐述清楚,故不再写文字介绍,直接看代码吧!)

    本篇介绍java8的新特性之一:流接口Streams。  

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import org.junit.Test;

/**
 * 流接口(Streams)
	java.util.Stream代表着一串你可以在其上进行多种操作的元素。流操作既可以是连续的也可以是中断的。
	中断操作返回操作结果。而连续操作返回流本身,这样你就可以在该行上链式方法调用。
	流是创建在数据源上的,例如:java.util.Collection、list集合和set集合(Map不支持)。流操作既可以顺序执行也可以并行执行。
	我们首先了解下顺序的流是如何工作的。我们首先创建一个字符串链表。
 */
public class StreamDemo {
	static List<String> stringCollection = new ArrayList<>();
	
	static{		
		stringCollection.add("ddd2");
		stringCollection.add("aaa2");
		stringCollection.add("bbb1");
		stringCollection.add("aaa1");
		stringCollection.add("bbb3");
		stringCollection.add("ccc");
		stringCollection.add("bbb2");
		stringCollection.add("ddd1");
	}
	//Java8的Collections类已经被扩展了,你可以简单的调用Collection.stream()或者Collection.parallelSteam()来创建流。
	//下面部分将介绍大部分流操作。
	
	/**
	 * Filter接受一个predicate来过滤流中的所有元素。这个操作是连续的,它可以让我们在结果上继续调用另外一个流操作forEach。
	 * ForEach接受一个consumer,它被用来对过滤流中的每个元素执行操作。ForEach是一个中断操作. 
	 * forEach返回void,因此我们不能在ForEach后调用其他流操作。
	 */
	@Test
	public void Filter(){
		 
		stringCollection
		.stream()
		.filter( (s) ->s.startsWith("a") )
		.forEach(System.out::println);
		// "aaa2" , "aaa1"
	}
	
	/**
	 * Sorted is an intermediate operation which returns a sorted view of the stream. 
	 * The elements are sorted in natural order unless you pass a custom Comparator.
	 */
	@Test
	public void Sorted(){
		stringCollection
		.stream()
		.sorted()
		.filter( (s) -> s.startsWith("a") )
		.forEach(System.out::println);
		// "aaa1" , "aaa2"
		
		//Keep in mind that sorted does only create a sorted view of the stream 
		//without manipulating the ordering of the backed collection.
		//The ordering of stringCollection is untouched:
		System.out.println(stringCollection); //[ddd2, aaa2, bbb1, aaa1, bbb3, ccc, bbb2, ddd1]
	}
	
	/**
	 * Map
		连续性操作map通过指定的Function将流中的每个元素转变为另外的对象。
		下面的示例将每个字符串转换为大写的字符串。
		此外,你也可以使用map将每个元素的类型改变为其它类型。
		转换后流的泛型类型依赖于你传入的Function的泛型类型。
	 */
	@Test
	public void Map(){
		stringCollection
		.stream()
		.map(String::toUpperCase)
		.sorted( (a, b) -> b.compareTo(a))
		.forEach(System.out::print);
		// // "DDD2", "DDD1", "CCC", "BBB3", "BBB2", "AAA2", "AAA1"  
	}
	
	/**
	 * 各种匹配操作可以用来检测某种predicate是否和流中元素相匹配。所有的这些操作是中断的并返回一个boolean结果。
	 */
	@Test
	public void Match(){
		boolean anyStartWithA = 
				stringCollection.stream().anyMatch((s) -> s.startsWith("a"));
		System.err.println(anyStartWithA); // true
		
		boolean allStartWithA = 
				stringCollection.stream().allMatch((s)->s.startsWith("a"));
		System.err.println(allStartWithA); // false
		
		boolean noneStartWithA = 
				stringCollection.stream().noneMatch((s) -> s.startsWith("z"));
		System.err.println(noneStartWithA); // true
	}
	
	/**
	 * Count
		Count是中断型操作,它返回流中的元素数量。
	 */
	@Test
	public void Count(){
		long startWithB = 
				stringCollection
				.stream()
				.filter((s)->s.startsWith("b"))
				.count();
		System.err.println(startWithB); // 3
	}
	
	/**
	 * Reduce
	 * 这个中断性操作使用指定的function对流中元素实施消减策略。此操作的返回值是一个包括所有被消减元素的Optional。
	 */
	@Test
	public void Reduce(){
		Optional<String> optional = 
				stringCollection
				.stream()
				.sorted()
				.reduce((s1, s2)->s1+"#"+s2 );
		
		optional.ifPresent(System.out::print);		
		// aaa1#aaa2#bbb1#bbb2#bbb3#ccc#ddd1#ddd2
	}
	
}

详情请见这篇博客:
 java8新特性教程 

    原文作者:gdouchufu
    原文地址: https://blog.csdn.net/gdouchufu/article/details/29242933
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞