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));
相关推荐
TeDi TIVE23 分钟前
springboot和springframework版本依赖关系
java·spring boot·后端
二哈赛车手23 分钟前
新人笔记---ES和kibana启动问题以及一些常用的linux的错误排查方法,以及ES,数据库泄密解决方案[超详细]
java·linux·数据库·spring boot·笔记·elasticsearch
嵌入式×边缘AI:打怪升级日志32 分钟前
嵌入式Linux开发核心自测题(全系列精华浓缩)
java·linux·运维
FQNmxDG4S1 小时前
JVM内存模型详解:堆、栈、方法区与垃圾回收
java·jvm·算法
jason.zeng@15022071 小时前
Androidr入门环境搭建
java·kotlin
摇滚侠1 小时前
整洁的桌面和任务栏 Java 开发工程师提效方法
java·开发语言
每天都要加油呀!2 小时前
多租户中间件适配
java·多租户
014-code2 小时前
Java 并发中的原子类
java·开发语言·并发
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题】【Java基础篇】第29题:静态代理和动态代理的区别是什么
java·开发语言·后端·面试·代理模式
善恶怪客2 小时前
Java-数组和可变参数
java·开发语言