Stream

一:介绍

1.Stream也叫Stream流,是JDK8开始新增的一套API(java.util.stream.*),可以用用于操作集合或者数组的数据。

2.优势:Stream流大量的结合了Lambda的语法风格来编程,提供了一种更加强大,更加简单的方式操作集合或者数组中的数据,代码更简洁,可读性更好。

3.简单示例:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

public class Test1 {
    public static void main(String[] args) {
        List<String> Name = new ArrayList<>();
        Collections.addAll(Name, "王凯","蔡建宇","樊军鑫","余洋","杨博铭");
        // 要筛选出名字为三个字的人
        // 正常方式
        List<String> list1 = new ArrayList<>();
        for (String s : Name) {
            if (s.length() == 3){
                list1.add(s);
            }
        }
        System.out.println(list1);

        // Stream流方式
        List<String> list2 = Name.stream().filter(s -> s.length() == 3).collect(Collectors.toList());
        System.out.println(list2);
    }
}

二:获取Stream流

1.获取集合的Stream流

方法:

Stream<E> stream() 获取当前集合对象的Stream流

2.获取数组的Stream流

stream(T[] array) 获取当前数组的Stream流

of(T...values) 获取当前接受数据的Stream流

3.示例:

import java.util.*;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class Test2 {
    public static void main(String[] args) {
        // 1.获取List集合的Stream流
        List<String> goods = new ArrayList<>();
        Collections.addAll(goods, "手表","护腕","耳机","跑鞋");
        Stream<String> s1 = goods.stream();

        // 2.获取Set集合的Stream流
        Set<String> run = new HashSet<>();
        Collections.addAll(run, "压缩裤","速干衣","口粮鞋","运动耳机","运动手表");
        Stream<String> s2 = run.stream();

        // 3.获取Map集合的Stream流
        Map<String,Double> Speed = new HashMap<>();
        Speed.put("第一次五公里", 5.34);
        Speed.put("第二次五公里", 5.02);
        Speed.put("第三次五公里", 4.49);
        Speed.put("最新一次五公里", 4.07);
        Speed.put("第一次十公里", 4.49);
        Speed.put("第一次十五公里", 4.47);

        // ①分别获取键和值的
        Set<String> list1 = Speed.keySet();
        Stream<String> s3 = list1.stream();

        Collection<Double> list2 = Speed.values();
        Stream<Double> s4 = list2.stream();

        // ②通过键值对来获取
        Set<Map.Entry<String, Double>> entries = Speed.entrySet();
        Stream<Map.Entry<String, Double>> s5 = entries.stream();

        s5.filter(s -> s.getKey().contains("一")).forEach(System.out::println);
        // 4.获取数组中的Stream流
        int[] num = {11,22,33,44,55,66,77,88};
        // 方式①
        IntStream s6 = Arrays.stream(num);

        // 方式②
        Stream<int[]> s7 = Stream.of(num);
    }
}

三:Stream流常见的中间方法

1.中间方法指的是调用完成后会返回新的Stream流,可以继续使用(支持链式编程)。

2.Stream流提供的常用中间方法:

filter(Predicate<? super T> predicate) 用于对流中数据进行过滤

sorted() 对元素进行升序排序

sorted(Comparator<? super T> comparator) 按照指定规则排序

limit(long maxSize) 获取前几个元素

skip(long n) 跳过前几个元素

distinct() 去除流中重复的元素

map(Function<? superT,? extends R> mapper) 对元素进行加工并返回对应的新流

concat(Stream a,Stream b) 合并a和b两个流为一个流

3.示例:

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Test3 {
    public static void main(String[] args) {
        List<Student> stu = new ArrayList<>();
        stu.add(new Student("蔡建宇", 18, 159.4));
        stu.add(new Student("蔡建宇", 18, 159.4));
        stu.add(new Student("高赞翔", 21, 164.6));
        stu.add(new Student("李炜洁", 19, 173.4));
        stu.add(new Student("付志豪", 20, 178.9));

        //1.过滤出身高高于175的人
        stu.stream().filter(s -> s.getHeight()>175).forEach(System.out::println);
        System.out.println("------------------------------------------------------");

        //2.对按照年龄对对象进行升序排序
        stu.stream().sorted().forEach(System.out::println);//默认对于对象没指定比较规则无法排序
        System.out.println("------------------------------------------------------");

        //3.按照升高对对象身高进行降序排序
        stu.stream().sorted(((o1, o2) -> Double.compare(o2.getHeight(), o1.getHeight()))).forEach(System.out::println);
        System.out.println("------------------------------------------------------");

        //4.获取集合中的身高最高的三人
        stu.stream().sorted(((o1, o2) -> Double.compare(o2.getHeight(), o1.getHeight()))).limit(3).forEach(System.out::println);
        System.out.println("------------------------------------------------------");

        //5,集合中跳过最高三人获取最矮的那个人
        stu.stream().sorted(((o1, o2) -> Double.compare(o2.getHeight(), o1.getHeight()))).skip(3).forEach(System.out::println);
        System.out.println("------------------------------------------------------");

        //6.去除流中重复的元素
        stu.stream().distinct().forEach(System.out::println);//默认希望去除内容一样的对象要重写类中的equals和hashCode方法
        System.out.println("------------------------------------------------------");

        //7.对元素进行加工并返回对应的新流如找到低于160的人并去除名字相同的对象
        stu.stream().filter(s -> s.getHeight() < 160).map(Student::getName)//Student::getName 相当于 s -> s.getName
        .distinct().forEach(System.out::println);
        System.out.println("------------------------------------------------------");

        //8.合并两个流为一个流
        Stream<String> s1 = Stream.of("王凯", "蔡建宇");
        Stream<String> s2 = Stream.of("刘涛", "田猛");
        Stream.concat(s1, s2).forEach(System.out::println);

    }
}

四:Stream流常见的终结方法

1.终结方法指的是调用完成后,不会返回新的Stream了,没法继续使用流了。

收集Stream流:就是把Stream流操作后的结果转回到集合或者数组中去返回。

Stream流:方便操作集合/数组的手段集合/数组:才是开发中的目的

2.Stream提供的常见终结方法:

forEach(Consumer action) 对此流运算后的元素执行遍历

count() 统计此流运算后的元素个数

max(Comparator<? super T> comparator) 获取此流运算后的最大值元素

min(Comparator<? super T> comparator) 获取此流运算后的最小值元素

collect(Collector collector) 把流处理后的结果收集到一个指定的集合中去

toArray() 把流处理后的结果收集到一个数组中去

3.示例:

import java.util.*;
import java.util.stream.Collectors;

public class Test4 {
    public static void main(String[] args) {
        List<Student> stu = new ArrayList<>();
        stu.add(new Student("蔡建宇", 18, 159.4));
        stu.add(new Student("蔡建宇", 18, 159.4));
        stu.add(new Student("高赞翔", 21, 164.6));
        stu.add(new Student("李炜洁", 19, 173.4));
        stu.add(new Student("付志豪", 20, 178.9));

        //1.对此流运算后的元素执行遍历
        stu.stream().filter(s -> s.getAge() > 20).forEach(System.out::println);
        System.out.println("------------------------------------------------------");

        //2.统计此流运算后的元素个数
        long size = stu.stream().filter(s -> s.getHeight() > 160).count();
        System.out.println(size);
        System.out.println("------------------------------------------------------");

        //3.得到身高最高的人
        Student s1 = stu.stream().max(((o1, o2) -> Double.compare(o1.getHeight(), o2.getHeight()))).get();
        System.out.println(s1);
        System.out.println("------------------------------------------------------");

        //4.得到身高最低的人
        Student s2 = stu.stream().min(((o1, o2) -> Double.compare(o1.getHeight(), o2.getHeight()))).get();
        System.out.println(s2);
        System.out.println("------------------------------------------------------");

        //5.将身高超过160的人储存到一个新的集合中去
        List<Student> s3 = stu.stream().filter(s -> s.getHeight() > 160).collect(Collectors.toList());
        System.out.println(s3);
        System.out.println("------------------------------------------------------");

        Set<Student> s4 = stu.stream().filter(s -> s.getHeight() > 160).collect(Collectors.toSet());
        System.out.println(s4);
        System.out.println("------------------------------------------------------");

        //6.将身高超过170的人的名字和身高存储到Map集合中去
        Map<String, Double> s5 = stu.stream().filter(s -> s.getHeight() > 170).collect(Collectors.toMap(a -> a.getName(), b -> b.getHeight()));
        System.out.println(s5);


    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值