Stream流的基本用法

Stream流的特点:

  1. Stream自己不会储存元素。
  2. Stream不会改变源对象,相反他们会返回一个持有结果的新Stream。
  3. Stream操作实延迟的,会等到需要结果时才执行。

Stream的使用步骤

  1. 创建流
  2. 添加中间操作
  3. 终止操作

创建流

public class Demo3 {
    public static void main(String[] args) {
        //创建流
//		1 通过Collection对象的stream()或parallelStream()方法。
        ArrayList<String> list=new ArrayList<String>();
        list.add("张三");
        list.add("李瑞");
        list.add("东冉");
        list.add("楚俊");
        list.add("赵六");
        //串行流(单线程)
        Stream<String> stream = list.stream();
        //并行流(多线程,效率高)
        Stream<String> parallelStream = list.parallelStream();
        stream.forEach(System.out::println);

//		2 通过Arrays类的stream()方法。
        IntStream stream2 = Arrays.stream(new int[] {10,8,100,20,50});
        stream2.forEach(System.out::println);

//
//		3通过Stream接口的of()、iterate()、generate()方法。
        System.out.println("----------3通过Stream接口的of()、iterate()、generate()方法。---------");
        Stream<Integer> stream3 = Stream.of(100,200,300,400,500);
        //iterate 迭代流 了解
//		Stream<Integer> stream4=Stream.iterate(0, x->x+2);// 0 2 4 6 8 10 .....
//		stream4.limit(10).forEach(System.out::println);
//
        //generate() 生成流 了解
//		Stream<Integer> stream5=Stream.generate(()->new Random().nextInt(100));
//		stream5.limit(5).forEach(System.out::println);
//
//		4通过IntStream、LongStream、DoubleStream接口中的of、range、rangeClosed方法。
        System.out.println("------	4通过IntStream、LongStream、DoubleStream接口中的of、range、rangeClosed方法。-----");
        IntStream intStream = IntStream.of(30,25,12,8,9);
        intStream.forEach(System.out::println);

        IntStream range = IntStream.rangeClosed(0, 100);
        range.forEach(System.out::println);


    }

}

添加中间操作

/**
 *
 * 中间操作:
 *  1 filter、limit、skip、distinct、sorted
 *
 *  2 map
 *
 *  3 parallel
 *
 * @author wgy
 *
 */
public class Demo4 {
    public static void main(String[] args) {
        // 1 filter、limit、skip、distinct、sorted
        ArrayList<Employee> list = new ArrayList<Employee>();
        list.add(new Employee("李瑞", 18, 20000));
        list.add(new Employee("东冉", 20, 25000));
        list.add(new Employee("楚俊", 20, 26000));
        list.add(new Employee("云龙", 28, 50000));
        list.add(new Employee("焦川", 22, 30000));
        list.add(new Employee("焦川", 22, 30000));
        // 1.1 filter 过滤
        System.out.println("---- filter 过滤-----");
        // 需求1 过滤年龄大于等于20
        list.stream().filter(e -> e.getAge() >= 20).forEach(System.out::println);
        System.out.println("-----");
        // 需求2 过滤工资大于等于30000
        list.stream().filter(e -> e.getSalary() >= 30000).forEach(System.out::println);
        // 1.2 limit 限制
        System.out.println("---- limit 限制-----");
        list.stream().limit(2).forEach(System.out::println);
        // 1.3 skip 跳过
        System.out.println("---- skip 跳过-----");
        list.stream().skip(2).limit(2).forEach(System.out::println);
        // 1.4 distinct 去掉重复
        System.out.println("---- distinct 去掉重复-----");
        list.stream().distinct().forEach(System.out::println);
        // 1.5sorted 排序
        System.out.println("----sorted  排序-----");
        list.stream().sorted((o1, o2) -> {
            int n1 = o1.getAge() - o2.getAge();
            int n2=Double.compare(o1.getSalary(), o2.getSalary());
            return n1 == 0 ? n2 : n1;
        }).forEach(System.out::println);

        // 2 map 映射
        System.out.println("------2 map---------");
        list.stream()
                .map(e->e.getSalary())
                .forEach(System.out::println);

        //3 parallel 并行流
        list.stream()
                .parallel()
                .forEach(System.out::println);

    }
}

终止操作

/**
 * 终止操作:
forEach、min、max、count
reduce、collect
 * @author wgy
 *
 */
public class Demo7 {
	public static void main(String[] args) {
	
		ArrayList<Employee> list = new ArrayList<Employee>();
		list.add(new Employee("李瑞", 18, 20000));
		list.add(new Employee("东冉", 20, 25000));
		list.add(new Employee("楚俊", 20, 26000));
		list.add(new Employee("云龙", 28, 50000));
		list.add(new Employee("焦川", 22, 30000));
		list.add(new Employee("焦川", 22, 30000));
		
		//1 forEach 遍历
		//2 min 最小值 max最大值  count 统计数量
		//Optional 防止NullPointerException的类
		Optional<Employee> min=list.stream()
			.min((e1,e2)->Double.compare(e1.getSalary(), e2.getSalary()));
		System.out.println(min.get());
		
		Optional<Employee> max=list.stream()
				.max((e1,e2)->Double.compare(e1.getSalary(), e2.getSalary()));
			System.out.println(max.get());
			
		long count = list.stream().count();
		System.out.println(count);
		
		//3 reduce 归约
		//计算所有人的工资的和
		Optional<Double> sum=list.stream()
			.map(e->e.getSalary())
			.reduce((s1,s2)->s1+s2);
		System.out.println(sum.get());
		//4collect 收集
		//获取所有人的工资的List集合
		List<Double> salays = list.stream()
			.map(e->e.getSalary())
			.collect(Collectors.toList());
//		Double avg = list.parallelStream()
//				.map(e->e.getSalary())
//				.collect(Collectors.averagingDouble(d->d));
		//System.out.println(avg);
		System.out.println("------collect 收集------");
		for (Double d : salays) {
			System.out.println(d);
		}
		
		
		
		
	
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值