Stream如何使用

自从公司项目jdk升级到1.8,发现了一个极其屌炸的东西,Stream流
在这里插入图片描述
单从“Stream”这个单词上来看,似乎和java的io流有点关系,其实关系不大;它的出现主要是由于Lambda 表达式的出现,主要是方便程序员们操作集合(Collection),极大的提高了编程效率和程序可读性。

Stream
就类似于一个迭代器,将集合内所有的元素遍历一遍,在遍历的过程中,对其中的元素进行一系列的操作,比如:按条件过滤元素、获取元素属性、甚至是元素类型转换等;

废话不多说,直接开搞————
一、创建流
要想对一个流进行操作首先得有数据源,也就是源头流,可以使集合,也可以是数组。如果是数组的话可以使用 Arrays.stream()或者Stream.of() 创建流;如果是集合的话则直接使用 stream() 创建流,该方法已经集成到Collection接口中。

List<String> list = new ArrayList<String>();
        list.add("张三");
        list.add("李四");
        list.add("王二麻子");
        list.add("张三");
        list.stream().distinct().forEach(x->System.out.println("元素:"+x));

结果:

元素:张三
元素:李四
元素:王二麻子

distinct()是一个去重操作,并且是一个中间操作,因为distinct方法后面还可以追加操作:

long len = list.stream().distinct().count();
        System.out.println("长度:"+len);
长度:3

中间操作可以有多个,并且多个操作同时生效,例如:

list.stream().distinct().filter(x-> x.contains("李")).forEach(x->System.out.println("元素过滤:"+x));

元素:张三
元素:李四
元素:王二麻子
长度:3
元素过滤:李四

既可以去重也可以进行元素过滤,filter也可以是多个,可以是不同的条件,但是最终结果是所有条件生效后的结果,可以理解为 每一个中间操作都是建立在前一个操作成功的结果之上。
创建流的另外两种方式:

String[] arr = new String[]{"张三", "李四", "王二麻子"};
Stream<String> stream = Arrays.stream(arr);
stream = Stream.of("张三", "李四", "王二麻子");

其实查看源码可以发现下面两种方式其实是一种方式,因为**Stream.of()**本质上也是调用的
Arrays.stream()

二、映射
在流的操作过程中可以使用map()方法对流元素进行映射,方法接收的是一个 Function(Java 8 新增的一个函数式接口,接受一个输入参数 T,返回一个结果 R)类型的参数,此时参数 为 String 类的 length 方法,也就是把 Stream 的流转成一个 Stream 的流。

List<String> list = new ArrayList<String>();
list.add("张三");
list.add("李四");
list.add("王二麻子");
list.add("张三他大爷");
Stream<Integer> integerStream = list.stream().map(String::length);
integerStream.forEach(System.out::println);

看下结果:

2
2
4
5

再比如这种自定义实体对象类型,获取对象的名称:

Student student = new Student("张三",21);
        Student student1 = new Student("李四",22);
        Student student2 = new Student("王二麻子",23);

        List<Student> students = new ArrayList<>();
        students.add(student);
        students.add(student1);
        students.add(student2);
        Stream<String> stringSteam = students.stream().map(Student::getName);
        stringSteam.forEach(System.out::println);

结果:

张三
李四
王二麻子

三:组合
reduce() 方法的主要作用是把 Stream 中的元素组合起来,例如:

List<String> list = new ArrayList<String>();
        list.add("张三");
        list.add("李四");
        list.add("王二麻子");
        list.add("张三他大爷");

        String optional = list.stream().reduce("组合:",(a, b)->a+b);
        System.out.println(optional);

结果:

组合:张三李四王二麻子张三他大爷

如果把上面说的所有的操作组合起来是啥样子呢:

List<String> list = new ArrayList<String>();
        list.add("张三");
        list.add("李四");
        list.add("王二麻子");
        list.add("张三他大爷");

        String optional = list.stream().filter(x->x.contains("张")).reduce("组合:",(a, b)->a+b);
        System.out.println(optional);
        int optional1 = list.stream().filter(x->x.contains("张")).map(String::length).reduce(0,(a, b)->a+b);
        System.out.println(optional1);

结果:

组合:张三张三他大爷
7

可以看到:流的操作过程中始终是流,就可以使用各种条件方法不限次的进行操作
四、如何将流变回集合
Stream提供了专门的转换方法collect()。

List<Student> students = new ArrayList<>();
        students.add(student);
        students.add(student1);
        students.add(student2);
        List<Student> students1 = students.stream().filter(x->x.getName().equals("张三")).collect(Collectors.toList());
        System.out.println("students1"+students1);
        List<String> names =  students.stream().map(Student::getName).collect(Collectors.toList());
        System.out.println("names"+names);
students1[Student{name='张三', age=21}]
names[张三, 李四, 王二麻子]

最后,collect()功能不仅于此,还有很多强大的功能,分组,整合,合并等,下次再说。

原创文章 2 获赞 6 访问量 158

猜你喜欢

转载自blog.csdn.net/flycp/article/details/105996536