java8 -- Stream

java8 Stream API和I/O流是不一样的,它是操作集合元素的API,专注于对集合对象进行各种非常便利、高效的聚合操作

  操作的时候,会把集合转成Stream,在stream中对集合进行过滤(filter),遍历操作(map),排序(sorted)等操作

学习 stream,最好把Lambda 和方法引用学习下;

自己只是根据ibm 社区 练习了 一下

代码体现:

package com.xiaodu.java8Stream;

import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.Optional;
import java.util.Random;
import java.util.concurrent.SynchronousQueue;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;

import org.junit.Test;

/**
 * 测试java8 Stream
 *   使用Stream 对集合进行操作
 *      使用stream会大量使用lambda 和方法引用
 *
 */
public class TestJava8Stream {
	
	
	/**
	 * 使用forEach 遍历
	 * 	forEach 是terminal 操作,也就是流的末尾操作,操作完就关闭流了 ,所以输出后不能进行其他操作了
	 */
	@Test
	public void TestStreamForEach() {
//		创建集合
		List<String> list = Arrays.asList("a","b","c","d","ef");
//		                                备注:(System.out::print) 是实例方法引用
		list.stream().forEach(System.out::print);
		/*
		 * 使用peek 遍历输出 peek是intermediate 操作,是在流中间片段进行操作的,不会涉及到关流,
		 * 所以还能再流中,对元素进行操作
		 */
		List<String> collect =
				 list.stream().peek(System.out::println)
					 .map(l -> l+l).collect(Collectors.toList());
		System.out.println(collect);
		
	}
	
	
	
	/**
	 * 使用map 遍历元素 对每个元素进行操作
	 */
	@Test
	public void TestStreamMap() {
//		创建集合
		List<String> list = Arrays.asList("aaa","bbb","ccc","dd","ef");
//		截取字符串
		List<String> collect = list.stream().map(a -> a.substring(0, 2)).collect(Collectors.toList());
		System.out.println(collect); // [aa, bb, cc, dd, ef]
//		转换为大写
		List<String> collect2 = list.stream().map(a -> a.toUpperCase()).collect(Collectors.toList());
		System.out.println(collect2);// [AAA, BBB, CCC, DD, EF]
//		 使用flatMap 对多个集合进行操作
		List<Integer> collect3 = 
				Stream.of(Arrays.asList(1,2,3),Arrays.asList(7,8,9))
				.flatMap(a -> a.stream()).collect(Collectors.toList());
		System.out.println(collect3);
		
	}
	
	/**
	 * 使用filter  进行集合的过滤
	 */
	@Test
	public void TestStreamFilter() {
		
		List<Integer> list = Arrays.asList(1,2,5,4,7,6);
		
//		求偶
		List<Integer> collect = list.stream().filter(a -> a%2==0).collect(Collectors.toList());
		System.out.println(collect); //[2, 4, 6]
//		求大于3 的值
		List<Integer> collect2 = list.stream().filter(a -> a>3).collect(Collectors.toList());
		System.out.println(collect2);//[5, 4, 7, 6]
		
//		
		List<String> strs = Arrays.asList("aaa","bbb","ccc","dd","ef");
//		获取指定字符串长度的值
		List<String> collect3 = strs.stream().filter(str -> str.length()>2).collect(Collectors.toList());
		System.out.println(collect3); // [aaa, bbb, ccc]
		
	}
	
	/**
	 * 聚合操作
	 */
	@Test
	public void TestStreamAggregation() {
		
		List<Integer> list = Arrays.asList(1,2,5,4,7,6);
		IntSummaryStatistics intStream = 
				list.stream().mapToInt(l -> l).summaryStatistics();
		System.out.println("集合 求和 = " +intStream.getSum());
		System.out.println("集合平均数= " + intStream.getAverage());
		System.out.println("集合元素个数= " + intStream.getCount());
		System.out.println("集合最大值= " + intStream.getMax());
		System.out.println("集合最小值= " + intStream.getMin());
		
//		排序
		List<Integer> sort = list.stream().sorted().collect(Collectors.toList());
		System.out.println(sort);  //[1, 2, 4, 5, 6, 7]
//		倒序
		List<Integer> desc = list.stream().sorted((a,b) -> -1).collect(Collectors.toList());
		System.out.println(desc);
		
	}
	
	/**
	 * limit  skip  distinct
	 */
	@Test
	public void TestStreamLimit() {
		List<Integer> list = Arrays.asList(1,2,5,4,7,6);
//		获取下坐标小于3 的值
		List<Integer> collect = list.stream().limit(3).collect(Collectors.toList());
		System.out.println(collect);  //[1, 2, 5]
//		获取下坐标大于等于4的值
		List<Integer> collect2 = list.stream().skip(4).collect(Collectors.toList());
		System.out.println(collect2);//[7, 6]
//		去重
		List<String> strs = Arrays.asList("e","c","c","","","a","a");
		List<String> collect3 = strs.stream().sorted().distinct().collect(Collectors.toList());
		System.out.println(collect3); //[, a, c, e]
		
		
	}
	
	
	/**
	 * reduce  归纳
	 */
	@Test
	public void TestStreamReduce() {
		
		List<Integer> list = Arrays.asList(1,2,5,4,7,6,-2);
//		求和
		System.out.println(list.stream().reduce(Integer::sum)); 
//		求最大值
		System.out.println(list.stream().reduce(Integer::max));
//		求最小值
		System.out.println(list.stream().reduce(Integer::min));
		
	}
	
	
	/**
	 * Match
	 * 	  -anyMatch  有一个匹配就返回true 
	 *    -allMatch  全部匹配才返回true
	 *    -noneMatch 全部不匹配返回true
	 */
	@Test
	public void TestStreamMatch() {
		
		List<String> list = Arrays.asList("小明","小红","天天","12345");
//		集合中是否有一个叫天天的
		boolean anyMatch = list.stream().anyMatch(str -> str.equals("天天"));
		System.out.println(anyMatch); //true
//		集合长度大于5的
		System.out.println(list.stream().allMatch(str -> str.length()>5)); // false
//		判断集合中是否有""
		System.out.println(list.stream().noneMatch(str -> str.length()==6));
		
	}
	
	/**
	 * iterate
	 *    注意iterate 必须结合limit 使用 
	 */
	@Test
	public void TestStreamIterate() {
//		获取等差 集合
		List<Integer> collect = Stream.iterate(0, i -> i+2).limit(5).collect(Collectors.toList());
		System.out.println(collect);//[0, 2, 4, 6, 8]
		
	}
}

imb链接

Streams 的背景,以及 Java 8 中的使用详解:https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/

猜你喜欢

转载自blog.csdn.net/xiaodujava/article/details/84281347