Stream流及其使用步骤

Stream流

Stream流是简化集合、数组操作的API。并且结合了Lambda表达式

java 复制代码
package com.itheima.demo1hashset.demo3stream;

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

public class StreamDemo1 {
    public static void main(String[] args) {
        //目标:认识Stream流,掌握其基本使用步骤,体会它的优势和特点
        List<String> list = new ArrayList<>();
        list.add("张楚岚");
        list.add("荒天帝");
        list.add("叶天帝");
        list.add("罗峰");
        list.add("唐三");
        list.add("李星云");

        //1、先用传统方案找出姓张的人,名字为三个字的,存入到一个新集合中去
        List<String> newlist = new ArrayList<>();
        for (String name : list) {
            if(name.startsWith("张") && name.length() == 3){
                newlist.add(name);
            }
        }

        //2、使用Stream流
        List<String> newlist2 = list.stream().filter(name -> name.startsWith("张")).filter(name -> name.length() == 3).collect(Collectors.toList());
        System.out.println(newlist2);
    }
}

Stream的使用步骤

1、获取Stream流

1、Stream流本质上是一个接口,可以通过直接调以下方法可以得到一个数组,不需要单独new;

2、所有单列集合拿Stream流都是调Stream方法;

3、Map集合要通过map.keySet().stream()和map.values().stream()分别获得键和值的Stream流或用map.entrySet()把Map类型打成Set类型

4、方法中的T通配任意类型,其中最后一个可以接一个参数、多个参数或者一个数组

java 复制代码
package com.itheima.demo1hashset.demo3stream;

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

public class StreamDemo2 {
    public static void main(String[] args) {
        //目标:获取Stream流的方式
        //1、获取集合的Stream流,调用集合提供的Stream()方法
        Collection<String> list = new ArrayList<>();
        Stream<String> s1 = list.stream();

        //2、Map集合获取Stream流
        Map<String, Integer> map = new HashMap<>();
        //获取键值Stream流
        Stream<String> s2 = map.keySet().stream();
        //获取值的Stream流
        Stream<Integer> s3 = map.values().stream();
        //获取键值对Stream流
        Stream<Map.Entry<String, Integer>> s4 = map.entrySet().stream();

        //3、数组获取Stream流
        String[] arr = {"张三", "张三丰", "张翠山", "张无忌"};
        Stream<String> s5 = Arrays.stream(arr);
        Stream<String> s6 = Stream.of("张三", "张三丰", "张翠山", "张无忌");//效果一样
    }
}

2、调用流水线的各种方法(中间方法)

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

java 复制代码
package com.itheima.demo1hashset.demo3stream;

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

public class StreamDemo3 {
    public static void main(String[] args) {
        //目标:掌握Stream流提供的常用的中间方法,对流上的数据进行处理(返回新流,支持链式编程)
        List<String> list = new ArrayList<>();
        list.add("张楚岚");
        list.add("荒天帝");
        list.add("叶天帝");
        list.add("罗峰");
        list.add("唐三");
        list.add("李星云");

        //1、过滤方法
        list.stream().filter(name -> name.startsWith("张")).forEach(System.out::println);//forEach遍历每一个流并且都打印一次,是一个终结方法,而不是中间方法

        //2、排序方法
        List<Double> scores = new ArrayList<>();
        scores.add(99.9);
        scores.add(66.6);
        scores.add(77.7);
        scores.add(88.8);
        scores.add(66.6);
        scores.stream().sorted().forEach(System.out::println);//默认是升序
        scores.stream().sorted((s1,s2) -> Double.compare(s2,s1)).forEach(System.out::println);//降序
        scores.stream().sorted((s1,s2) -> Double.compare(s2,s1)).limit(2).forEach(System.out::println);//只要前两名
        scores.stream().sorted((s1,s2) -> Double.compare(s2,s1)).skip(2).forEach(System.out::println);//跳过前两名
        //如果希望自定义对象能够取去重复,重写对象的hashCode和euqals方法,才可以去重复
        scores.stream().sorted((s1,s2) -> Double.compare(s2,s1)).distinct().forEach(System.out::println);//去重

        //映射/加工方法,把流上原来的数据拿出来变成新数据又放到流上去
        scores.stream().map(s -> "加十分后" + (s+10)).forEach(System.out::println);

        //合并流,一次只能合并两个流
        Stream<String> arr = Stream.of("张三", "张三丰", "张翠山", "张无忌");
        Stream<Integer> arr2 = Stream.of(111,222);
        Stream<Object> s3 = Stream.concat(arr, arr2);
        System.out.println(s3.count());//6
    }
}

Stream的终结方法

流只是用来操作数据,Stream终结方法将结果转回到集合或数组中去。流处理完毕数据一定要收集到集合或数组中去;

流只能收集一次

java 复制代码
//获取薪水最高的老师对象,得给比较规则
        Optional<Teacher> max =Teachers.stream().max((t1, t2) -> t1.getsalary() - Double.compare(t1.getsalary(), t2.getsalary()));
        Teacher maxTeacher = max.get();//获取Optional对象中的元素
        System.out.println(maxTeacher);
java 复制代码
//收集到集合或数组中去
Stream<String> s1 = list.stream().filter(s -> s.startsWith("张"));

//收集到List集合(支持重复)
List<String> list1 = s1.collect(Collectors.toList());//流只能收集一次
System.out.println(list1);

//收集到Set集合(不支持重复)
Set<String> set = s1.collect(Collectors.toSet());
System.out.println(set1);

//收集到数组(可重复)
Stream<String> s3 = list.stream().filter(s -> s.startsWith("张"));
Object[] array = s3.toArray();
System.out.println("数组:"+ Arrays.toString(array));
相关推荐
lang201509282 小时前
Spring MVC文件上传:commons-fileupload解析全流程
java·spring·mvc
benpaodeDD2 小时前
黑马SpringBoot3整合springMVC,mybatis
java·spring boot
极客Kimi2 小时前
从Java架构到AI架构:机器学习、深度学习与LLM的技术融合之路
java·人工智能·架构
梁萌2 小时前
Java中正则表达式提取PDF内容
java·pdfbox·pdf解析·内容提取·正则解析
战族狼魂2 小时前
Python 完整实现 BCrypt GUI 工具
java·前端·python
Overt0p2 小时前
抽奖系统(7)
java·开发语言·spring boot·redis·tomcat·rabbitmq
Dylan的码园2 小时前
深入浅出Java排序:从基础算法到实战优化(上)
java·数据结构·算法
J_liaty2 小时前
前后端跨域处理全指南:Java后端+Vue前端完整解决方案
java·前端·vue.js·spring boot·后端
颜淡慕潇2 小时前
深度解读 Spring Boot 3.5.9— 工程视角的稳健演进与价值释放
java·spring boot·后端·spring