JavaSE基础学习——Stream流

1. Stream流概述

Stream流的作用是简化集合、数组操作的API。结合了Lambda表达式。
Stream流式思想的核心

  • 先得到集合或者数组的Stream流(就是一根传送带)
  • 把元素放上去
  • 然后就用这个Stream流简化的API来方便的操作元素

2. Stream流的获取

2.1 Stream流的三类方法

  • 获取Stream流:创建一条流水线,并把数据放到流水线上准备进行操作
  • 中间方法:流水线上的操作。一次操作完毕之后,还可以继续进行其他操作
  • 终结流:一个Stream流只能有一个终结方法,是流水线上的最后一个操作

2.2 获取Stream流的方式

2.2.1集合获取Stream流的方式

  • 可以使用Collection接口中的默认方法stream()生成流
    在这里插入图片描述

2.2.2数组获取Stream流的方式

在这里插入图片描述

public class StreamDemo02 {
    public static void main(String[] args) {
        /** --------------------Collection集合获取流-------------------------------   */
        Collection<String> list = new ArrayList<>();
        Stream<String> s = list.stream();

        /** --------------------Map集合获取流-------------------------------   */
        Map<String, Integer> maps = new HashMap<>();

        // 键流
        Stream<String> keyStream = maps.keySet().stream();
        // 值流
        Stream<Integer> valueStream = maps.values().stream();
        // 键值对流(整体)
        Stream<Map.Entry<String, Integer>> keyAndValueStream = maps.entrySet().stream();

        /** ---------------------数组获取流------------------------------   */
        String[] names = {"赵敏","小昭","灭绝","周芷若"};
        Stream<String> nameStream = Arrays.stream(names);
        Stream<String> nameStream2 = Stream.of(names);
    }
}

3. Stream流的常用API

3.1 Stream流的常用中间操作方法

在这里插入图片描述

  • 中间方法也称为非终结方法,调用完成后返回新的Stream流可以继续使用,支持链式编程。
  • 在Stream流中无法直接修改集合、数组中的数据。

3.2 Stream流的常用终结操作方法

在这里插入图片描述

  • 终结操作方法,调用完成后流就无法继续使用了,原因是不会返回Stream了。

4. Stream流的综合应用

在这里插入图片描述

public class StreamDemo04 {
    public static double allMoney;
    public static double allMoney2; // 2个部门去掉最高工资,最低工资的总和
    public static void main(String[] args) {

        List<Employee> one = new ArrayList<>();
        one.add(new Employee("猪八戒",'男',30000 , 25000, null));
        one.add(new Employee("孙悟空",'男',25000 , 1000, "顶撞上司"));
        one.add(new Employee("沙僧",'男',20000 , 20000, null));
        one.add(new Employee("小白龙",'男',20000 , 25000, null));

        List<Employee> two = new ArrayList<>();
        two.add(new Employee("武松",'男',15000 , 9000, null));
        two.add(new Employee("李逵",'男',20000 , 10000, null));
        two.add(new Employee("西门庆",'男',50000 , 100000, "被打"));
        two.add(new Employee("潘金莲",'女',3500 , 1000, "被打"));
        two.add(new Employee("武大郎",'女',20000 , 0, "下毒"));

        // 2、开发1部的最高工资的员工
        // 制定大小规则
//        Employee e = one.stream().max((e1, e2) -> Double.compare(e1.getSalary() + e1.getBones(), e2.getSalary() + e2.getBones()))
//                .get();
//        System.out.println(e);
        Topperformer t = one.stream().max((e1, e2) -> Double.compare(e1.getSalary() + e1.getBones(), e2.getSalary() + e2.getBones()))
                .map(e -> new Topperformer(e.getName(), e.getSalary() + e.getBones())).get();
        System.out.println(t);

        // 2、统计平均工资,去掉最高工资和最低工资
        one.stream().sorted((e1, e2) -> Double.compare(e1.getSalary() + e1.getBones(), e2.getSalary() + e2.getBones()))
                .skip(1).limit(one.size() - 2).forEach(e -> {
                    // 求出总和:剩余员工的工资总和
            allMoney += (e.getSalary() + e.getBones());
        });

        System.out.println("开发一部的平均工资是:" + allMoney / (one.size() - 2));

        // 3、合并两个集合流,再统计
        Stream<Employee> s1 = one.stream();
        Stream<Employee> s2 = two.stream();
        Stream<Employee> s3 = Stream.concat(s1, s2);
        s3.sorted((e1, e2) -> Double.compare(e1.getSalary() + e1.getBones(), e2.getSalary() + e2.getBones()))
                .skip(1).limit(one.size() + two.size() - 2).forEach(e -> {
                    // 求出总和:剩余员工的工资总和
                    allMoney2 += (e.getSalary() + e.getBones());
                });
        // BigDecimal
        BigDecimal a = BigDecimal.valueOf(allMoney2);
        BigDecimal b = BigDecimal.valueOf(one.size() + two.size() - 2);
        System.out.println("开发部的平均工资是:" + a.divide(b, 2, RoundingMode.HALF_UP));
    }
}

5. 收集Stream流

  • 就是把Stream流操作后的结果数据转回到集合或者数组中去。
  • Stream:方便操作集合/数组的手段
  • 集合/数组:才是开发中的目的
    在这里插入图片描述
public class StreamDemo05 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("张无忌");
        list.add("周芷若");
        list.add("赵敏");
        list.add("张强");
        list.add("张三丰");
        list.add("张三丰");

        Stream<String> s1 = list.stream().filter(s -> s.startsWith("张"));
        List<String> zhangList = s1.collect(Collectors.toList());// 可变集合
        zhangList.add("Java");
        System.out.println(zhangList);

//        List<String> list1 = s1.toList();// 得到不可变集合
//        list1.add("java");
//        System.out.println(list1);

        // 注意注意注意:"流只能使用一次"
        Stream<String> s2 = list.stream().filter(s -> s.startsWith("张"));
        Set<String> zhangSet = s2.collect(Collectors.toSet());
        System.out.println(zhangSet);

        Stream<String> s3 = list.stream().filter(s -> s.startsWith("张"));
        //Object[] arrs = s3.toArray();
        String[] arrs = s3.toArray(String[]::new);// 可以不管,拓展一下思维
        System.out.println("Arrays数组内容:" + Arrays.toString(arrs));
    }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值