Stream流-Java

Stream流的作用:

结合了Lambda表达式,简化集合,数组的操作

Stream流的使用步骤:

1. 先得到一条Stream流(流水线),并把数据放上去

获取方式 方法名 说明
单列集合 default Stream<E> stream() Collection中的默认方法
双列集合 无法直接使用stream流
数组 public static <T> Stream<T> stream(T[] array) Arrays工具类中的静态方法
一堆零散数据 public static<T> Stream<T> of(T... values) Stream接口中的静态方法
复制代码
				//1.单列集合获取Stream流
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"a","b","c","d","e","f","g","h");
        //获取到一条流水线,并把集合中的数据放到流水线上
        Stream<String> stream = list.stream();
        //使用终结方法打印一下流水线上的所有数据
        stream.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                //s表示流水线上的每一个数据
                System.out.println(s);
            }
        });
        
        //forEach方法中的参数类型是Consumer<? super T> ,而这个参数类型点到源码会发现他是
        //一个函数式接口,因此也就可以使用lambda表达式简化上述代码。
        list.stream()
                .forEach(s -> System.out.println(s));

			  //双列集合    无法直接使用stream流
        //1.创建双列集合
        HashMap<String, Integer> hm = new HashMap<>();
        //2.添加数据
        hm.put("aaa",111);
        hm.put("bbb",222);
        hm.put("ccc",333);
        hm.put("ddd",444);

        //3.第一种获取stream流
        hm.keySet().stream().forEach(s -> System.out.println(s));
        //4.第二种获取stream流
        hm.entrySet().stream().forEach(s -> System.out.println(s));

//一堆零散数据    public static<T> Stream<T> of(T... values)    Stream接口中的静态方法
Stream.of(1,2,3,4,5).forEach(s -> System.out.println(s));
Stream.of("a","b","c").forEach(s -> System.out.println(s));

注意:

Stream接口中静态方法of的细节

方法的形参是一个可变参数,可以传递一堆零散的数据,也可以传递数组

但是数组必须是引用数据类型的,如果传递基本数据类型,是会把整个数组当作一个元素,存放到Stream当中。

2. 利用Stream流中的API进行各种操作

  1. 中间方法:方法调用完毕之后,还可以调用其他方法
Stream<T> filter (Predicate<?super T>predicate) 过滤
Stream<T> limit (long maxSize) 获取前几个元素
Stream<T> skip (long n) 跳过前几个元素
Stream<T> distinct() 元素去重,依赖(hashCode和equals方法)
static<T>Stream<T> concat (Stream a,Streamb) 合并a和b两个流为一个流
Stream<R> map (Function<T,R> mapper) 转换流中的数据类型

注意一:中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程。

注意二:修改Stream流中的数据,不会影响原来集合或者数组中的数据。

  1. 终结方法:最后一步,调用完之后,不能调用其他方法
名称 说明
void forEach(Consumer action) 遍历
long count() 统计
toArray() 收集流中的数据,放到数组中
collect(Collector collector) 收集流中的数据,放到集合中(List(可以有重复元素) Set(没有重复元素) Map)
复制代码
				ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"a","b","c");
        /**
         * IntFunction 的泛型:具体类型的数组
         * apply的形参:流中数据的个数,要跟数组的长度保持一致
         * apply的返回值:具体类型的数组
         * 方法体:就是创建数组
         *
         * toArray方法的参数的作用:负责创建一个指定类型的数组
         * toArray方法的底层,会依次得到流里面的每一个数据,并把数据放到数组当中
         * toArray方法的返回值:是一个装着流里面所有数据的数组
         *
         */
        String[] array = list.stream().toArray(new IntFunction<String[]>() {
            @Override
            public String[] apply(int value) {
                return new String[value];
            }
        });
        System.out.println(Arrays.toString(array));

        String[] array1 = list.stream().toArray(value -> new String[value]);
        System.out.println(Arrays.toString(array1));

				ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"a-男-11","b-男-34","c-男-24","d-男-22","e-女-13","f-女-51","g-女-15");

        Map<String, Integer> collect = list.stream().filter(s -> "男".equals(s.split("-")[1]))
                /**
                 * toMap:参数一表示键的生成规则
                 *        参数二表示值的生成规则
                 *
                 * 参数一:
                 *     Function泛型一:表示流中每一个数据的类型
                 *         泛型二:表示Map集合中键的数据类型
                 *     方法apply形参:依次表示流里面的每一个数据
                 *         方法体:生成键的代码
                 *         返回值:已经生成的键
                 *
                 * 参数二:
                 *     Function泛型一:表示流中每一个数据的类型
                 *         泛型二:表示Map集合中值的数据类型
                 *     方法apply形参:依次表示流里面的每一个数据
                 *         方法体:生成值的代码
                 *         返回值:已经生成的值
                 */
                .collect(Collectors.toMap(new Function<String, String>() {
                                              @Override
                                              public String apply(String s) {
                                                  return s.split("-")[0];
                                              }
                                          },
                        new Function<String, Integer>() {
                            @Override
                            public Integer apply(String s) {
                                return Integer.parseInt(s.split("-")[2]);
                            }
                        }));
        System.out.println(collect);

        Map<String, Integer> collect1 = list.stream().filter(s -> "男".equals(s.split("-")[1]))
                .collect(Collectors.toMap(s -> s.split("-")[0],
                        s -> Integer.parseInt(s.split("-")[2]))
                );
        System.out.println(collect1);

注意:

如果我们要收集到Map集合当中,键不能重复,否则会报错。

相关推荐
javadaydayup几秒前
Java注解底层竟然是个Map?
java
程序视点4 分钟前
2025最新Windows/Office离线激活工具全指南 - Activation Program使用教程
windows
regret~18 分钟前
【记录】C++生产者 / 消费者 案例
开发语言·c++
火山锅1 小时前
🚀 Spring Boot枚举转换新突破:编译时处理+零配置,彻底告别手写转换代码
java·架构
overFitBrain1 小时前
数据结构-5(二叉树)
开发语言·数据结构·python
秋千码途1 小时前
小架构step系列25:错误码
java·架构
rookiesx2 小时前
安装本地python文件到site-packages
开发语言·前端·python
m0_687399842 小时前
Ubuntu22 上,用C++ gSoap 创建一个简单的webservice
开发语言·c++
屁股割了还要学2 小时前
【C语言进阶】一篇文章教会你文件的读写
c语言·开发语言·数据结构·c++·学习·青少年编程
微露清风2 小时前
系统性学习C语言-第二十二讲-动态内存管理
c语言·开发语言·学习