Skip to content
小鹏的Notes
Main Navigation 首页 笔记汇总
📱 3D翻盖手机
🎬 Siena Film
✨ 设计动效
🎲 疯狂 3D 游戏库
Github仓库 留言板 说说
黑马八股
小林Coding
导航网站
电脑截屏工具Snipaste
PDF工具
编辑图片
ip解析
电脑屏幕检测
文件格式转换

深浅模式

Sidebar Navigation

自我介绍

👨「代码炼金术士」

🌍「诗的浪漫极客」

Java基础学习

Java基础知识

Java集合

IO流

多线程

File文件

异常

网络编程

注解

Stream流

log日志

XML

反射和动态代理

方法引用

单元测试

类加载器

Java后端

JavaWeb SpringBoot 学习

苍穹外卖

微服务

SpringCloud学习

RabbitMQ

Nacos源码分析

Sentinel源码分析

Linux学习

Linux学习

Git学习

Git学习

Docker学习

Docker学习

中间件

ElasticSearch

RabbitMQ

数据库学习

Mysql学习-汇总

Mysql学习-基础篇

Mysql学习-高级篇

Mysql学习-运维篇

中间件学习

MybatisPlus学习

待续...

前端学习

Vue学习

HTML+CSS+移动端

目录

Stream流 ​

更新: 2025/4/9 字数: 0 字 时长: 0 分钟

一、体验Stream流的作用 ​

image-20250312135120500

java
package com.pyw.a46StreamDemo1;

import java.util.ArrayList;

public class StreamDemo1 {
    public static void main(String[] args) {
        /*
            创建集合添加元素,完成以下需求:
            1.把所有以“张”开头的元素存储到新集合中
            2.把“张”开头的,长度为3的元素再存储到新集合中
            3.遍历打印最终结果
        */
        ArrayList<String> list1 = new ArrayList<>();
        list1.add("张无忌");
        list1.add("周芷若");
        list1.add("赵敏");
        list1.add("张强");
        list1.add("张三丰");

        //stream流
        list1.stream().filter(name -> name.startsWith("张"))
                .filter(name -> name.length() == 3)
                .forEach(name -> System.out.println(name));


        //1.把所有以“张”开头的元素存储到新集合中
        ArrayList<String> list2 = new ArrayList<>();

        for (String s : list1) {
            if (s.startsWith("张")) {
                list2.add(s);
            }
        }

        //2.把“张”开头的,长度为3的元素再存储到新集合中
        ArrayList<String> list3 = new ArrayList<>();

        for (String s : list2) {
            if (s.length() == 3) {
                list3.add(s);
            }
        }

        //3.遍历打印最终结果
        System.out.println(list2);
        System.out.println(list3);

    }
}

二、Stream流的思想 ​

image-20250312140333076

三、Stream流的作用和步骤 ​

image-20250312140505254

image-20250312140535912

  • 先得到一条Stream流(流水线),并把数据放上去
  • 使用中间方法对流水线上的数据进行操作
  • 使用终结方法对流水线上的数据进行操作

四、获取Stream流 ​

image-20250312140641479

1、单列集合-Collection-list.stream() ​

java
package com.pyw.a46StreamDemo1;


import java.util.ArrayList;
import java.util.Collections;
import java.util.stream.Stream;

public class StreamDemo2 {
    public static void main(String[] args) {
/*
        单列集合   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");
        //获取到一条流水线,并把集合中的数据放到流水线上
        Stream<String> stream = list.stream();
        //使用终结方法打印一下流水线上的所有数据
        stream.forEach(str -> System.out.println(str));

        //也可以简写
        list.stream().forEach(str -> System.out.println(str));

    }
}

2、双列集合-Map-map.keySet.stream() ​

java
package com.pyw.a46StreamDemo1;

import java.util.HashMap;

public class StreamDemo3 {
    public static void main(String[] args) {
        // 双列集合      无      无法直接使用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流 key
        hm.keySet().stream().forEach(s -> System.out.println(s));

        //4.第二种获取stream流 获取键值对对象entry
        hm.entrySet().stream().forEach(s-> System.out.println(s));
    }
}

输出:

java
aaa
ccc
bbb
ddd
aaa=111
ccc=333
bbb=222
ddd=444

3、数组-Arrays.stream() ​

image-20250312141606076

java
package com.pyw.a46StreamDemo1;

import java.util.Arrays;
import java.util.stream.Stream;

public class StreamDemo4 {
    public static void main(String[] args) {
        //数组 public static <T> Stream<T> stream(T[] array)        Arrays工具类中的静态方法

        //1.创建数组
        int[] arr1 = {1,2,3,4,5,6,7,8,9,10};

        String[] arr2 = {"a","b","c"};

        //2.获取stream流
        Arrays.stream(arr1).forEach(str -> System.out.println(str));
        System.out.println("============================");
        //引用数据类型-使用泛型接收
        Arrays.stream(arr2).forEach(str -> System.out.println(str));

        System.out.println("============================");
        //注意:
        //Stream接口中静态方法of的细节
        //方法的形参是一个可变参数,可以传递一堆零散的数据,也可以传递数组
        //但是数组必须是引用数据类型的,如果传递基本数据类型,是会把整个数组当做一个元素,放到Stream当中。
        Stream.of(arr1).forEach(str -> System.out.println(str));//[I@3b9a45b3

    }
}

注意:

  • Stream接口中静态方法of的细节
  • 方法的形参是一个可变参数,可以传递一堆零散的数据,也可以传递数组
  • 但是数组必须是引用数据类型的,如果传递基本数据类型,是会把整个数组当做一个元素,放到Stream当中。

4、一堆零散数据-Stream.of(...) ​

注意:

  • Stream接口中静态方法of的细节
  • 方法的形参是一个可变参数,可以传递一堆零散的数据,也可以传递数组
  • 但是数组必须是引用数据类型的,如果传递基本数据类型,是会把整个数组当做一个元素,放到Stream当中。
java
package com.pyw.a46StreamDemo1;

import java.util.stream.Stream;

public class StreamDemo5 {
    public static void main(String[] args) {
        //一堆零散数据   public static<T> Stream<T> of(T... values)    Stream接口中的静态方法

        //类型必须一致
        Stream.of(1,2,3,4,5).forEach(str -> System.out.println(str));
        //引用数据类型
        Stream.of("a","b","c").forEach(str -> System.out.println(str));
    }
}

五、Stream流的==中间方法== ​

image-20250312143318480

0、注意事项 ​

  • 注意1:中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程
  • 注意2:修改Stream流中的数据,不会影响原来集合或者数组中的数据

1、filter-过滤 ​

java
package com.pyw.a46StreamDemo1;

import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Predicate;

public class StreamDemo6 {
    public static void main(String[] args) {
        /*
        TODO Stream 中间方法
            filter              过滤
            limit               获取前几个元素
            skip                跳过前几个元素

            注意1:中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程
            注意2:修改Stream流中的数据,不会影响原来集合或者数组中的数据
        */

        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "张无忌", "周芷若", "赵敏", "张强", "张三丰", "张翠山", "张良", "王二麻子", "谢广坤");

        //filter   过滤  把张开头的留下,其余数据过滤不要
        list.stream().filter(new Predicate<String>() {
            @Override
            public boolean test(String s) {
                //如果返回值为true,表示当前数据留下
                //如果返回值为false,表示当前数据舍弃不要
                return s.startsWith("张");
            }
        }).forEach(s -> System.out.println(s));

        //简化写法
        //如果返回值为true,表示当前数据留下
        //如果返回值为false,表示当前数据舍弃不要
        list.stream().filter(s -> s.startsWith("张")).forEach(s -> System.out.println(s));


        System.out.println("=============");
        //limit获取前几个元素
        list.stream().limit(2).forEach(s -> System.out.println(s));
        System.out.println("=============");
        //skip跳过前几个元素
        list.stream().skip(3).forEach(s -> System.out.println(s));

        //课堂练习:
        //"张强", "张三丰", "张翠山"
        System.out.println("=============");
        list.stream().skip(3).limit(3).forEach(s -> System.out.println(s));

    }
}

2、limit-获取前几个元素 ​

java
System.out.println("=============");
//limit获取前几个元素
list.stream().limit(2).forEach(s -> System.out.println(s));

3、skip-跳过前几个元素 ​

java
System.out.println("=============");
//skip跳过前几个元素
list.stream().skip(3).forEach(s -> System.out.println(s));

//课堂练习:
//获取"张强", "张三丰", "张翠山"
System.out.println("=============");
list.stream().skip(3).limit(3).forEach(s -> System.out.println(s));
//或者
list.stream().limit(6).skip(3).forEach(s -> System.out.println(s));

4、distinct-元素去重 ​

依赖(hashCode和equals方法)

  • 因为底层是使用hashSet去重的,所以如果使用的是自定义对象如Student需要重写hashCode和equals方法
java
package com.pyw.a46StreamDemo1;

import java.util.ArrayList;
import java.util.Collections;
import java.util.stream.Stream;

public class StreamDemo7 {
    public static void main(String[] args) {
        /*
            distinct            元素去重,依赖(hashCode和equals方法)
            concat              合并a和b两个流为一个流

            注意1:中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程
            注意2:修改Stream流中的数据,不会影响原来集合或者数组中的数据
        */

        ArrayList<String> list1 = new ArrayList<>();
        Collections.addAll(list1, "张无忌","张无忌","张无忌", "张强","张无忌", "张三丰", "张翠山", "张良", "王二麻子", "谢广坤");


        ArrayList<String> list2 = new ArrayList<>();
        Collections.addAll(list2, "周芷若", "赵敏");

        //distinct 去重
        //基于hashcode 和equals 如果是自定义封装对象需要重写这两个方法
        list1.stream().distinct().forEach(s -> System.out.println(s));

        System.out.println("=======");
        //concat 合并
        //注:最好使用一个类型,如果不一致使用a b共同的父类
        Stream.concat(list1.stream(),list2.stream()).forEach(s -> System.out.println(s));
    }
}

5、contact-合并两个流为一个流 ​

java
System.out.println("=======");
//concat 合并
//注:最好使用一个类型,如果不一致使用a b共同的父类
Stream.concat(list1.stream(),list2.stream()).forEach(s -> System.out.println(s));

6、map-转换数据类型 ​

java
package com.pyw.a46StreamDemo1;

import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Function;

public class StreamDemo8 {
    public static void main(String[] args) {
        /*
            //TODO map                 转换流中的数据类型

            注意1:中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程
            注意2:修改Stream流中的数据,不会影响原来集合或者数组中的数据
        */

        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "张无忌-15", "周芷若-14", "赵敏-13", "张强-20", "张三丰-100", "张翠山-40", "张良-35", "王二麻子-37", "谢广坤-41");
        //需求:只获取里面的年龄并进行打印
        //String->int

        //第一个类型:流中原本的数据类型
        //第二个类型:要转成之后的类型

        //apply的形参s:依次表示流里面的每一个数据
        //返回值:表示转换之后的数据

        //当map方法执行完毕之后,流上的数据就变成了整数
        //所以在下面forEach当中,s依次表示流里面的每一个数据,这个数据现在就是整数了
        list.stream().map(new Function<String, Object>() {
            @Override
            public Integer apply(String s) {
                //按照-切割切割后0索引存储-左边的数据,1索引存储-右边的数据
                String[] split = s.split("-");
                Integer i = Integer.valueOf(split[1]);
                return i;
            }
        }).forEach(s -> System.out.println(s));
        

        System.out.println("==========");
        //简化
        list.stream().map(s -> Integer.valueOf(s.split("-")[1])).forEach(s -> System.out.println(s));
    }
}

六、Stream流的==终结方法== ​

image-20250312145014704

1、forEach-遍历 ​

java
package com.pyw.a46StreamDemo1;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.function.Consumer;
import java.util.function.IntFunction;

public class StreamDemo9 {
    public static void main(String[] args) {
        /*
            //TODO Stream流中间方法
            void forEach(Consumer action)           遍历
            long count()                            统计
            toArray()                               收集流中的数据,放到数组中
       */

        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "张无忌", "周芷若", "赵敏", "张强", "张三丰", "张翠山", "张良", "王二麻子", "谢广坤");


        //对每一个数据进行操作
        //Consumer的泛型:表示流中数据的类型
        //accept方法的形参s:依次表示流里面的每一个数据
        //方法体:对每一个数据的处理操作(打印)
        //返回值为void,所以是终结方法了
        System.out.println("====遍历====");
        list.stream().forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });

        list.stream().forEach(s -> System.out.println(s));


        //统计
        System.out.println("====统计====");
        long count = list.stream().count();
        System.out.println(count);

        //toArray把结果放到数组中
        //toArray方法的参数的作用:负责创建一个指定类型的数组
        //toArray方法的底层,会一次得到流里面每一个数组,并把他放到数组中
        //toArray方法的返回值,是一个装着流里面所有数组的数组
        //IntFunction的泛型:具体类型的数组
        //apply的形参:流中数据的个数,要跟数组的长度保持一致
        //apply的返回值:具体类型的数组
        //方法体:就是创建数组
        //value:流里面的数组的长度是多少value就是多少
        System.out.println("====toArray把结果放到数组中====");
        String[] arr = list.stream().toArray(new IntFunction<String[]>() {
            @Override
            public String[] apply(int value) {
                return new String[value];
            }
        });
        System.out.println(Arrays.toString(arr));

        System.out.println("====toArray把结果放到数组中(Lambda)====");
        //Lambda表达式
        String[] arr2 = list.stream().toArray(len -> new String[len]);
        System.out.println(Arrays.toString(arr2));
    }
}

2、count-统计 ​

java
//统计
System.out.println("====统计====");
long count = list.stream().count();
System.out.println(count);

3、toArray-收集数据转为数组 ​

  • image-20250312150058988
    • toArray把结果放到数组中
    • toArray方法的参数的作用:负责创建一个指定类型的数组
    • toArray方法的底层,会一次得到流里面每一个数组,并把他放到数组中
    • toArray方法的返回值,是一个装着流里面所有数组的数组
    • IntFunction的泛型:具体类型的数组
    • apply的形参:流中数据的个数,要跟数组的长度保持一致
    • apply的返回值:具体类型的数组
    • 方法体:就是创建数组
    • value:流里面的数组的长度是多少value就是多少
java
//toArray把结果放到数组中
//toArray方法的参数的作用:负责创建一个指定类型的数组
//toArray方法的底层,会一次得到流里面每一个数组,并把他放到数组中
//toArray方法的返回值,是一个装着流里面所有数组的数组
//IntFunction的泛型:具体类型的数组
//apply的形参:流中数据的个数,要跟数组的长度保持一致
//apply的返回值:具体类型的数组
//方法体:就是创建数组
//value:流里面的数组的长度是多少value就是多少
System.out.println("====toArray把结果放到数组中====");
String[] arr = list.stream().toArray(new IntFunction<String[]>() {
    @Override
    public String[] apply(int value) {
        return new String[value];
    }
});
System.out.println(Arrays.toString(arr));

System.out.println("====toArray把结果放到数组中(Lambda)====");
//Lambda表达式
String[] arr2 = list.stream().toArray(len -> new String[len]);
System.out.println(Arrays.toString(arr2));

4、collect-收集数据转为集合 ​

java
package com.pyw.a46StreamDemo1;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

public class StreamDemo10 {
    public static void main(String[] args) {
        /*
            collect(Collector collector)   收集流中的数据,放到集合中 (List Set Map)

            注意点:
                如果我们要收集到Map集合当中,键不能重复,否则会报错
       */

        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "张无忌-男-15", "周芷若-女-14", "赵敏-女-13", "张强-男-20",
                "张三丰-男-100", "张翠山-男-40", "张良-男-35", "王二麻子-男-37", "谢广坤-男-41");

        //收集List集合当中
        //需求:把所有的男性收集起来
        //List集合不去重
        List<String> newList1 = list.stream()
                .filter(s -> "男".equals(s.split("-")[1]))
                .collect(Collectors.toList());
        System.out.println(newList1);

        //收集到Set集合当中
        //需求:把所有的男性收集起来
        //HashSet集合去重
        Set<String> newList2 = list.stream()
                .filter(s -> "男".equals(s.split("-")[1]))
                .collect(Collectors.toSet());
        System.out.println(newList2);

        //收集到Map集合当中
        //需求:把所有的男性收集起来
        //键:姓名,值年龄
        //HashSet集合去重
        Map<String, Integer> newMap = list.stream()
                .filter(s -> "男".equals(s.split("-")[1]))
                /*
                * toMap:参数一表示键的生成规则
                *       参数二表示值的生成规则
                *
                * 参数一:
                *       funcation泛型一:表示流中的每一个数据的类型
                *                泛型二:表示Map集合中键的数据类型
                *       方法apply形参:一次表示流里面的每一个数据
                *               方法体:生成键的代码
                *               返回值:map集合键的类型
                * 参数二:
                *       funcation泛型一:表示流中的每一个数据的类型
                *                泛型二:表示Map集合中值的数据类型
                *       方法apply形参:一次表示流里面的每一个数据
                *               方法体:生成值的代码
                *               返回值:map集合值的类型
                *
                 */
                .collect(Collectors.toMap(new Function<String, String>() {
                    @Override
                    public String apply(String s) {
                        System.out.println(s.split("-")[0]);
                        return s.split("-")[0];
                    }
                }, new Function<String, Integer>() {
                    @Override
                    public Integer apply(String s) {
                        return Integer.valueOf(s.split("-")[2]);
                    }
                }));

        //Lambda简写
        Map<String, Integer> newMap2 = list.stream()
                .filter(s -> "男".equals(s.split("-")[1]))
                .collect(Collectors.toMap(
                        s -> s.split("-")[0],
                        s -> Integer.valueOf(s.split("-")[2])));
        System.out.println(newMap);

        System.out.println(newMap2);

    }
}

(1)收集到List集合-Collectors.toList() ​

java
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "张无忌-男-15", "周芷若-女-14", "赵敏-女-13", "张强-男-20",
                   "张三丰-男-100", "张翠山-男-40", "张良-男-35", "王二麻子-男-37", "谢广坤-男-41");

//收集List集合当中
//需求:把所有的男性收集起来
//List集合不去重
List<String> newList1 = list.stream()
    .filter(s -> "男".equals(s.split("-")[1]))
    .collect(Collectors.toList());  //调用Collectors类的toList方法,收集List集合
System.out.println(newList1);

image-20250312151616697

image-20250312151731706

(2)收集到Set集合-Collectors.toSet() ​

java
//收集到Set集合当中
//需求:把所有的男性收集起来
//HashSet集合去重
Set<String> newList2 = list.stream()
    .filter(s -> "男".equals(s.split("-")[1]))
    .collect(Collectors.toSet());
System.out.println(newList2);

image-20250312151923731

(3)收集到Map集合-Collectors.toMap() ​

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

  • image-20250312152016351
    • toMap
      • 参数一表示键的生成规则
      • 参数二表示值的生成规则
    • 参数一:
      • funcation 泛型一:表示流中的每一个数据的类型
      • 泛型二:表示Map集合中键的数据类型
      • 方法apply形参:一次表示流里面的每一个数据
      • 方法体:生成键的代码
      • 返回值:map集合键的类型
    • 参数二:
      • funcation泛型一:表示流中的每一个数据的类型
      • 泛型二:表示Map集合中值的数据类型
      • 方法apply形参:一次表示流里面的每一个数据
      • 方法体:生成值的代码
      • 返回值:map集合值的类型
java
        //收集到Map集合当中
        //需求:把所有的男性收集起来
        //键:姓名,值年龄
        //HashSet集合去重
        Map<String, Integer> newMap = list.stream()
                .filter(s -> "男".equals(s.split("-")[1]))
                /*
                * toMap:参数一表示键的生成规则
                *       参数二表示值的生成规则
                *
                * 参数一:
                *       funcation泛型一:表示流中的每一个数据的类型
                *                泛型二:表示Map集合中键的数据类型
                *       方法apply形参:一次表示流里面的每一个数据
                *               方法体:生成键的代码
                *               返回值:map集合键的类型
                * 参数二:
                *       funcation泛型一:表示流中的每一个数据的类型
                *                泛型二:表示Map集合中值的数据类型
                *       方法apply形参:一次表示流里面的每一个数据
                *               方法体:生成值的代码
                *               返回值:map集合值的类型
                *
                 */
                .collect(Collectors.toMap(new Function<String, String>() {
                    @Override
                    public String apply(String s) {
                        System.out.println(s.split("-")[0]);
                        return s.split("-")[0];
                    }
                }, new Function<String, Integer>() {
                    @Override
                    public Integer apply(String s) {
                        return Integer.valueOf(s.split("-")[2]);
                    }
                }));

        //Lambda简写
        Map<String, Integer> newMap2 = list.stream()
                .filter(s -> "男".equals(s.split("-")[1]))
                .collect(Collectors.toMap(
                        s -> s.split("-")[0],
                        s -> Integer.valueOf(s.split("-")[2])));
        System.out.println(newMap);

        System.out.println(newMap2);

七、小结 ​

image-20250312151233227

八、综合练习 ​

1、数据过滤 ​

image-20250312152514400

java
package com.pyw.a46StreamDemo1;

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

public class StreamTest1 {
    public static void main(String[] args) {
        /*
            把1~10添加进集合,过滤奇数,只留下偶数将结果保存起来
         */
        ArrayList<Integer> list = new ArrayList<>();
        Collections.addAll(list,1,2,3,4,5,6,7,8,9,10);
        List<Integer> list1 = list.stream()
                .filter(i -> i % 2 == 0)
                .collect(Collectors.toList());
        System.out.println(list1);
    }
}

2、字符串过滤并收集 ​

image-20250312152539568

java
package com.pyw.a46StreamDemo1;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Map;
import java.util.stream.Collectors;

public class StreamTest2 {
    public static void main(String[] args) {
        /*
             在集合中保留年龄大于等于24岁的人,并存到map集合中
             姓名为键,年龄为值
             集合添加"zhangsan, 23","lisi, 24","wangwu, 25"

         */
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"zhangsan, 23","lisi, 24","wangwu, 25");

        Map<String, Integer> newMap = list.stream()
                .filter(s -> Integer.valueOf(s.split(", ")[1]) >= 24)
                .collect(Collectors.toMap(
                        s -> s.split(", ")[0],
                        s -> Integer.valueOf(s.split(", ")[1])));
        System.out.println(newMap);
    }
}

3、自定义对象过滤并收集-map ​

image-20250312152652037

java
package com.pyw.a46StreamDemo1;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class StreamTest3 {
    public static void main(String[] args) {
        /*
        //TODO 将两个集合合并后再转为自定义封装对象练习
        现在有两个ArrayList集合,分别存储6名男演员的名字和年龄以及6名女演员的名字和年龄。
        姓名和年龄中间用逗号隔开。
        比如:张三,23
        要求完成如下的操作:
        1,男演员只要名字为3个字的前两人
        2,女演员只要姓杨的,并且不要第一个
        3,把过滤后的男演员姓名和女演员姓名合并到一起
        4,将上一步的演员信息封装成Actor对象。
        5,将所有的演员对象都保存到List集合中。
        备注:演员类Actor,属性有:name,age

        男演员:  "蔡坤坤,24" , "叶齁咸,23", "刘不甜,22", "吴签,24", "谷嘉,30", "肖梁梁,27"
        女演员:  "赵小颖,35" , "杨颖,36", "高元元,43", "张天天,31", "刘诗,35", "杨小幂,33"
      */
        ArrayList<String> actor = new ArrayList<>();
        Collections.addAll(actor,"蔡坤坤,24" , "叶齁咸,23", "刘不甜,22", "吴签,24", "谷嘉,30", "肖梁梁,27");

        ArrayList<String> actress = new ArrayList<>();
        Collections.addAll(actress,"赵小颖,35" , "杨颖,36", "高元元,43", "张天天,31", "刘诗,35", "杨小幂,33");

        //1,男演员只要名字为3个字的前两人
        int count = 0;
        List<String> newActor = actor.stream()
                //获取名字为三个字
                .filter(s -> s.split(",")[0].length() == 3)
                //获取前两个数据
                .limit(2)
                .collect(Collectors.toList());
        System.out.println(newActor);

        List<String> newActress = actress.stream()
                //获取名字为杨开头的
                .filter(s -> s.startsWith("杨"))
                //获取第一个数据
                .skip(1)
                .collect(Collectors.toList());
        System.out.println(newActress);

        //3,把过滤后的男演员姓名和女演员姓名合并到一起
        List<Actor> actorList = Stream.concat(newActor.stream(), newActress.stream())
            	//4,类型转换-String -> Actor 将上一步的演员信息封装成Actor对象。
                .map(s -> new Actor(s.split(",")[0], Integer.valueOf(s.split(",")[1])))
            	//5,将所有的演员对象都保存到List集合中。
                .collect(Collectors.toList());
        System.out.println(actorList);
    }
}

Actor演员类

java
package com.pyw.a46StreamDemo1;

public class Actor {
    private String name;

    private Integer age;

    public Actor() {
    }

    public Actor(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

	//get set...

    @Override
    public String toString() {
        return "Actor{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

最后更新于:

Pager
上一篇 注解
下一篇 log日志

Released under the MIT License.

Copyright © 2025 渝ICP备2025054279号