JDK1.8新特性学习(四)——Stream流

本文详细探讨了JDK1.8引入的Stream流特性,包括其概念、核心API、并行流和实战应用,揭示了如何利用Stream流进行高效的数据处理和集合操作。
package test4;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.DoubleSummaryStatistics;
import java.util.List;import java.util.TooManyListenersException;
import java.util.function.Function;
import java.util.stream.Stream;

import com.oracle.jrockit.jfr.Producer;

import sun.net.www.content.text.plain;
import test.Product;

/**
 * jdk1.8 Stream流学习
 *
 */
public class StreamTest {
	
	/**
	 * 获取流的几种方式
	 */
	public static void test(){
		/*
		 * 数组——获取流 1
		 */
		String [] strList = {"1234","234","456"};
		Stream<String> stream = Arrays.stream(strList);
		/*
		 * 集合——获取流 2
		 */
		List<String> list = Arrays.asList("1234","234","456");
		Stream<String> stream2 = list.stream();
		/*
		 * 集合——获取流3
		 */
		Stream<String> stream3 = Stream.of("1234","234","456");
	}
	
	/**
	 * forEach() 使用该方法迭代流中的每个数据
	 */
	public static void test2(List<Product> list){
		/*
		 * JDK1.8前
		 */
		System.out.println("JDK1.8前");
		for (Product product : list) {
			System.out.println(product.toString());
		}
		
		/*
		 * java 8 lambda
		 */
		System.out.println("java 8 lambda");
		list.forEach(product->System.out.println(product));
		
		/*
		 * java 8 stream lambda
		 */
		System.out.println("java 8 stream lambda");
		list.stream().forEach(product->System.out.println(product));
	}
	
	/**
	 * sorted() 使用该方法排序数据
	 */
	public static void test3(List<Product> list){
		
		System.out.println("排序前");
		for (Product product : list) {
			System.out.println(product.toString());
		}
		System.out.println("排序后");
		
		System.out.println("JDK1.8前");
		Collections.sort(list, new Comparator<Product>(){
			@Override
			public int compare(Product o1, Product o2) {
				return o1.getPrice().compareTo(o2.getPrice());
			}
		});
		list.stream().forEach(product->System.out.println(product));
		
		System.out.println("JDK1.8 Stream 方法引用");
		list.stream().sorted(Comparator.comparing(Product::getPrice)).forEach(product->System.out.println(product));
	}
	
	/**
	 * 
	 * filter():使用该方法过滤
	 */
	public static void test4(List<Product> list){
		/*
		 *输出商品价格大于1000的商品 
		 */
		System.out.println("过滤前");
		list.forEach(product->System.out.println(product));
		System.out.println("过滤后");
		
		/*
		 * JDK1.8前
		 */
		System.out.println("JDK1.8前");
		for (Product product2 : list) {
			if (product2.getPrice() > 1000) {
				System.out.println(product2);
			}
		}
		
		System.out.println("JDK1.8后");
		list.stream().filter((Product p)->p.getPrice()>1000).forEach(b->System.out.println(b));
	}
	
	
	/**
	 * 
	 * limit():使用该方法截断
	 */
	public static void test5(List<Product> list){
		/*
		 *从前两个开始截断,只输出前两个
		 */
		System.out.println("截断前");
		list.forEach(product->System.out.println(product));
		System.out.println("截断后");
		
		/*
		 * JDK1.8前
		 */
		System.out.println("JDK1.8前");
		for (int i = 0; i < 2; i++) {
			System.out.println(list.get(i));
		}
		
		System.out.println("JDK1.8后");
		list.stream().limit(2).forEach(b->System.out.println(b));
	}
	
	
	/**
	 * 
	 * skip():与limit互斥,使用该方法跳过元素
	 * skip的位置开始于1
	 */
	public static void test6(List<Product> list){
		/*
		 *跳过前2个元素,从第3个输出
		 */
		System.out.println("原集合输出");
		list.forEach(product->System.out.println(product));
		System.out.println("跳过元素后");
		
		/*
		 * JDK1.8前
		 */
		System.out.println("JDK1.8前");
		for (int i = 0; i < list.size(); i++) {
			if(i >= 2){
				System.out.println(list.get(i));
			}
		}
		
		System.out.println("JDK1.8后");
		list.stream().skip(2).forEach(b->System.out.println(b));
	}
	
	
	/**
	 * 
	 * distinct():使用该方法去重,注意:必须重写对应泛型的hashCode()和equals()方法
	 */
	public static void test7(List<Product> list){
		/*
		 *跳过前2个元素,从第3个输出
		 */
		System.out.println("原集合输出");
		list.forEach(product->System.out.println(product));
		System.out.println("去重后");
		
		/*
		 * JDK1.8前,会报错
		 */
		System.out.println("JDK1.8前");
		int size = list.size();
		for (int i = 0; i < size; i++) {
			for (int j = list.size() - 1; j > i; j--) {
				if (list.get(i).getProductName().equals(list.get(j).getProductName()) && 
					list.get(i).getColor().equals(list.get(j).getColor()) &&
					list.get(i).getPrice().equals(list.get(j).getPrice())){
					list.remove(i);  //此处报错java.lang.UnsupportedOperationException
					size--;
					
				}
			}
		}
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}
		
		System.out.println("JDK1.8后");
		list.stream().distinct().forEach(b->System.out.println(b));
	}
	
	
	/**
	 * 
	 * 去重+取价格大于200从小到大+取前2
	 */
	public static void test8(List<Product> list){
		list.stream().distinct().filter(p->p.getPrice() >200)
					 .sorted(Comparator.comparing(Product::getPrice)).limit(2).forEach(b->System.out.println(b));
	}
	
	/**
	 * 
	 * max,min,sum,avg,count 
	 */
	public static void test9(List<Product> list){
		DoubleSummaryStatistics summaryStatistics = list.stream().mapToDouble(product -> product.getPrice()).summaryStatistics();
		System.out.println("总和"+summaryStatistics.getSum());
		System.out.println("平均"+summaryStatistics.getAverage());
		System.out.println("最大"+summaryStatistics.getMax());
		System.out.println("最小"+summaryStatistics.getMin());
		System.out.println("数量"+summaryStatistics.getCount());
	}
	
	/**
	 * 
	 * map():接收一个方法作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素
	 */
	public static void test10(List<Product> list){
		/**
		 * 只输出所有商品的价格
		 */
		List<Double> list2 = list.stream().map(p -> p.getPrice()).collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
		list2.forEach(p->System.out.print(p+","));
		
		/**
		 * 商品颜色全部转成大写
		 */
		List<String> list3 = list.stream().map(s -> s.getColor().toUpperCase()).collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
		list3.forEach(p->System.out.println(p));
	}
	
	
	/**
	 * 
	 * 将原来的stream中的所有元素都展开组成一个新的stream
	 */
	public static void test11(List<Product> list){
		//创建一个装有两个泛型为Integer的集合
		Stream<List<Integer>> stream = Stream.of(Arrays.asList(1,3,5),Arrays.asList(2,4));
		//将两个合为一个
		Stream<Integer> flatMap = stream.flatMap((Function<List<Integer>, Stream<Integer>>)integers->integers.stream());
		ArrayList<Integer> collect = flatMap.collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
		System.out.println("新Stream的大小"+collect.size());
		System.out.println("合并后");
		collect.forEach(p->System.out.println(p));
	}
	
	/**
	 *使用该方法获取第一个元素 
	 */
	public static void test12(List<Product> list){
		Product product = list.stream().findFirst().get();
		System.out.println(product);
	}
	
	
	public static void main(String[] args) {
		List<Product> list = Arrays.asList(
				new Product("雨伞","pink",56.0),
				new Product("短裤","blue",100.0),
				new Product("手表","Silver",1000.0),
				new Product("手表","Silver",1000.0),
				new Product("笔记本","white",10000.0),
				new Product("洗衣机","white",2000.0),
				new Product("电饼铛","white",200.0));
		//test2(list);
		//test3(list);
		//test4(list);
		//test5(list);
		//test6(list);
		//test7(list);
		//test8(list);
		//test9(list);
		//test10(list);
		//test11(list);
		test12(list);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值