JavaSe—Stream流☆

目录

1、认识Stream流

stream流的使用步骤

2、步骤1:获取stream流

3、步骤2:Stream流常用的方法

4、步骤3:Stream流的终极方法

5、收集Stream流


1、认识Stream流

  • streamjdk8开始新增的一套API(java.util.stream.*),可以用于操作集合或者数组的数据。

一些集合或者数组都有相应的方法进行操作数据为什么还要使用stream流呢?stream有什么优势呢?

  • 优势:Stream流大量的结合了Lambda的语法风格编程,功能强大,性能高效,代码简洁,可读性好。

体验Stream流

上面需求的代码实现,使用了传统的方法和Stream流两种方法:

java 复制代码
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class Demo3Stream {
    public static void main(String[] args) {
        //目标:认识stream 流,掌握stream 的基本使用,体会它的好处
        List<String> list = new ArrayList<>();  //创建数组列表
        list.add("张三");
        list.add("张三丰");
        list.add("熊大");
        list.add("赵敏");
        list.add("张无忌");
        list.add("张翠山");
        list.add("光头强");
        list.add("小龙女");
        //1、现在要将所有以张开头且3字符的元素,存储到一个新集合
        //方式1、使用传统方案
        //startsWith 判断字符串开头前缀
        List<String> list2 = new ArrayList<>();
        for (String s : list) {
            if(s.startsWith("张") && s.length() == 3){
                list2.add(s);
            }
        }
        System.out.println(list2);

        //方式2、使用 stream流
        System.out.println(list.stream().filter(s -> s.startsWith("张")).
                filter(s -> s.length() == 3).collect(Collectors.toList()));
    }
}
/*
[张三丰, 张无忌, 张翠山]
[张三丰, 张无忌, 张翠山]
 */

stream流的使用步骤

2、步骤1:获取stream流

  • 获取集合的stream流。
java 复制代码
import java.util.*;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class StreamDemo2 {
    public static void main(String[] args) { 
        //获取stream流
        //1、获取集合的stream流
        Collection<String> list = new ArrayList<>();
        Stream<String> streamList =list.stream(); //获取集合的stream流
        
        //2、获取Map集合的stream流
        Map<String, String> map = new HashMap<>();
        //map.stream(); //报错
        
        //获得Map集合键的stream流
        Stream<String> keyStream= map.keySet().stream();
        
        //获取Map值的stream流
        Stream<String > valuesStream =  map.values().stream();
        
        //获取键值对的stream流
        Stream<Map.Entry<String, String>> EntryStream = map.entrySet().stream();
        
        //3、获取数数组的stream流
        String[] arr = {"张三", "李四", "王五"};
        //方法1、
        Stream<String> streamArr = Arrays.stream(arr);  //
        //方法2、
        Stream<String> streamArr2 = Stream.of(arr);
        Stream<String> streamArr3 = Stream.of("张三", "李四", "王五"); //这里可以传入多个参数
    }
}

3、步骤2:Stream流常用的方法

java 复制代码
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

public class Demo4Stream {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("熊大");
        list.add("张三丰");
        list.add("张无忌");
        list.add("张翠山");
        //对流中的数据进行过滤,只保留姓张的
        Stream<String> streamlist = list.stream().filter(s -> s.startsWith("张"));
        streamlist.forEach(System.out::println);
        //sorted 排序对元素进行排序
        List<Double> list2 = new ArrayList<>();
        list2.add(4.1);
        list2.add(2.1);
        list2.add(3.1);
        list2.add(1.1);
        list2.add(1.1);
        list2.add(1.1);
        System.out.println("------------------------------排序------------------------------");
        Stream<Double> streamsorted = list2.stream().sorted();
        streamsorted.forEach(System.out::println); //1.1 2.1 3.1 4.1
        System.out.println("---------------------------------自定义排序---------------------------------");
        Stream<Double> stream2 = list2.stream().sorted((d1,d2)->d2.compareTo(d1));
        stream2.forEach(System.out::println);
        System.out.println("------------------------------------------谋取前几个元素------------------------------------------------");
        Stream<Double> stream3 = list2.stream().sorted().limit(2);
        stream3.forEach(System.out::println);
        System.out.println("------------------------------------------------------跳过前几个元素---------------------------------------------------------------");
        Stream<Double> stream4 = list2.stream().sorted().skip(2);
        stream4.forEach(System.out::println);
        System.out.println("_______________________去重____________________");
        Stream<Double> stream5 = list2.stream().distinct();
        stream5.forEach(System.out::println);
        System.out.println("_____________________映射_____________________");
        Stream<Double> stream6 = list2.stream().map(d -> d * 2).distinct();
        stream6.forEach(System.out::println);
        System.out.println("_____________________合并_____________________");
        Stream<Double> stream7 = Stream.of(1.1,2.2,3.3);
        Stream<Double> stream8 = Stream.of(4.4,5.5,6.6);
        Stream<Double> stream9 = Stream.concat(stream7,stream8);
        stream9.forEach(System.out::println);
    }
}
/*
张三丰
张无忌
张翠山
------------------------------排序------------------------------
1.1
1.1
1.1
2.1
3.1
4.1
---------------------------------自定义排序---------------------------------
4.1
3.1
2.1
1.1
1.1
1.1
------------------------------------------谋取前几个元素------------------------------------------------
1.1
1.1
------------------------------------------------------跳过前几个元素---------------------------------------------------------------
1.1
2.1
3.1
4.1
_______________________去重____________________
4.1
2.1
3.1
1.1
_____________________映射_____________________
8.2
4.2
6.2
2.2
_____________________合并_____________________
1.1
2.2
3.3
4.4
5.5
6.6
 */

4、步骤3:Stream流的终极方法

  • 终结方法指的是调用完成后,不会返回新的Stream流了,没法继续使流了。
java 复制代码
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

public class Demo5Stream {
    public static void main(String[] args) {
        List<Teacher> list = new ArrayList<>();
        list.add(new Teacher("张三", 18, 5000));
        list.add(new Teacher("张三丰", 50, 5006));
        list.add(new Teacher("张无忌", 20, 66008));
        list.add(new Teacher("张翠山", 30, 4000));
        list.add(new Teacher("赵敏", 18, 15000));

        list.stream().filter(t -> t.getSalary() > 10000).forEach(System.out::println);
        System.out.println("-----------------");
        long count = list.stream().count();
        System.out.println(count);
        System.out.println("-----------------");
        Optional<Teacher>max = list.stream().max((t1, t2) -> Double.compare(t1.getSalary(), t2.getSalary()));
        System.out.println(max.get()); //输出最大值对象
        System.out.println("-----------------");
        Optional<Teacher>min = list.stream().min((t1, t2) -> Double.compare(t1.getSalary(), t2.getSalary()));
        System.out.println(min.get());
    }
}
    /*
    Teacher{name='张无忌', age=20, salary=66008.0}
Teacher{name='赵敏', age=18, salary=15000.0}
-----------------
5
-----------------
Teacher{name='张无忌', age=20, salary=66008.0}
-----------------
Teacher{name='张翠山', age=30, salary=4000.0}
     */

5、收集Stream流

  • 收集Stream流:就是把Stream流操作后的结果传回到集合或者数组去返回。
  • Stream流:方便操作集合/数组的手段
  • 集合/数组:才是开发中的目的
java 复制代码
import java.util.*;
import java.util.stream.Collectors;

public class Demo6Stream {
    public static void main(String[] args) {
        //一个流只能收集一次
        System.out.println("--------------收集到List集合---------------------");
        List<String> list = new ArrayList<>();
        list.add("张三");
        list.add("张三丰");
        list.add("张无忌");
        list.add("熊大");
        list.add("赵敏");
        //把流收集到List集合
        List<String> li = list.stream().collect(Collectors.toList());
        li.forEach(System.out::println);
        System.out.println("--------------收集到Set集合---------------------");
        List<String> list1 = new ArrayList<>();
        list1.add("张三");
        list1.add("张三丰");
        list1.add("张无忌");
        list1.add("熊大");
        list1.add("赵敏");
        //把流收集到Set集合
        Set<String> set = list1.stream().collect(Collectors.toSet());
        System.out.println( set);
        System.out.println("--------------收集到Map集合---------------------");
        //把流收集到Map集合
        List<Teacher1> list2 = new ArrayList<>();
        list2.add(new Teacher1("张三", 5000));
        list2.add(new Teacher1("张三丰", 5006));
        list2.add(new Teacher1("张无忌", 15008));
//        Map<String, Double> map = list2.stream().collect(Collectors.toMap(new Function<Teacher1, String>() {
//            @Override
//            public String apply(Teacher1 teacher1) {
//                return teacher1.getName();
//            }
//        }, new Function<Teacher1, Double>() {
//            @Override
//            public Double apply(Teacher1 teacher1) {
//                return teacher1.getSalary();
//            }
//        }));

        //优化
        Map<String, Double> map = list2.stream().collect(Collectors.toMap(Teacher1::getName, Teacher1::getSalary));
        System.out.println( map);
        System.out.println("--------------收集到数组---------------------");
        List<String> list3 = new ArrayList<>();
        list3.add("张三");
        list3.add("张三丰");
        list3.add("张无忌");
        list3.add("熊大");
        list3.add("赵敏");
        Object[] arr = list3.stream().toArray();
        System.out.println(Arrays.toString(arr));
    }
}
/*
--------------收集到List集合---------------------
张三
张三丰
张无忌
熊大
赵敏
--------------收集到Set集合---------------------
[张三, 熊大, 张三丰, 赵敏, 张无忌]
--------------收集到Map集合---------------------
{张三=5000.0, 张三丰=5006.0, 张无忌=15008.0}
--------------收集到数组---------------------
[张三, 张三丰, 张无忌, 熊大, 赵敏]
 */
相关推荐
王桑.18 分钟前
IO流高级流--转换流
java
老鱼说AI25 分钟前
算法基础教学第一步:数据结构
数据结构·python·算法
2301_7951672026 分钟前
Python 高手编程系列八:缓存
开发语言·python·缓存
8***293136 分钟前
Go基础之环境搭建
开发语言·后端·golang
qq_124987075341 分钟前
基于SpringBoot技术的企业请假审批管理系统的设计与实现(源码+论文+部署+安装)
java·spring boot·后端·信息可视化·毕业设计
Yue丶越1 小时前
【C语言】自定义类型:联合体与枚举
c语言·开发语言
BBB努力学习程序设计1 小时前
Java方法详解:提升代码复用性与可读性的利器
java
BBB努力学习程序设计1 小时前
Java运算符完全指南:让代码学会“计算”和“判断”
java
csbysj20201 小时前
DOM 节点
开发语言
用户84913717547162 小时前
ThreadLocal 源码深度解析:JDK 设计者的“妥协”与“智慧”
java·后端