• Stream流编程


    目录

    获取流

    Stream流的常用方法:

     count

    .filter方法:

    forEach方法

    limit方法

    map方法

    skip方法

    concat方法

    收集Stream流 


     

    流格式

    1. Stream<T> filter(Predicate<? super T> predicate);
    2. -----> 参数:public interface Predicate<T> (函数式接口)
    3. ----> 抽象方法:boolean test(T t);
    4. -----> 参数:public interface Consumer<T> (函数式接口)
    5. ----> 抽象方法:boolean test(T t);
    获取流

    根据集合来获取:

    根据Collection获取流:

    Collection接口中有一个stream()方法,可以获取流

            default Stream stream()
    Stream<String> stream1 = list.stream();
    1. // 创建Map集合
    2. Map<Integer,String> map = new HashMap<>();
    3. map.put(1,"张老三");
    4. map.put(2,"张小三");
    5. map.put(3,"李四");
    6. map.put(4,"赵五");
    7. map.put(5,"张六");
    8. map.put(6,"王八");
    9. // 3.1根据Map集合的键获取流
    10. Set<Integer> map1 = map.keySet();
    11. Stream<Integer> stream3 = map1.stream();
    12. // 3.2根据Map集合的值获取流
    13. Collection<String> map2 = map.values();
    14. Stream<String> stream4 = map2.stream();
    15. // 3.3根据Map集合的键值对对象获取瑞
    16. Set<Map.Entry<Integer, String>> map3 = map.entrySet();
    17. Stream<Map.Entry<Integer, String>> stream5 = map3.stream();
    1. // 根据数组获取流
    2. String[] arr = {"张颜宇","张三","李四","赵五","刘六","王七"};
    3. Stream<String> stream6 = Stream.of(arr);

    Stream流的常用方法:

    终结方法:返回值类型不再是Stream接口本身类型的方法,例如:forEach方法和count方法

    非终结方法/延迟方法:返回值类型仍然是Stream接口自身类型的方法,除了终结方法都是延迟方法。例如:filter,limit,skip,map,conat

     count
    1. List<String> list = new ArrayList<>();
    2. list.add("张老三");
    3. list.add("张小三");
    4. list.add("李四");
    5. list.add("赵五");
    6. list.add("张六");
    7. list.add("王八");
    8. long count = list.stream().count();
    9. System.out.println("集合中的元素个数是:" + count);
    10. 输出结果:
    11. 集合中的元素个数是:6

    .filter方法:

    Stream filter(Predicate predicate); 过滤出满足条件的元素

    参数Predicate:函数式接口,抽象方法:boolean test (T t)

    Predicate接口:是一个判断接口

    1. // 获取stream流
    2. Stream<String> stream = Stream.of("张老三", "张小三", "李四", "赵五", "刘六", "王七");
    3. // 需求:过去出姓张的元素
    4. stream.filter((String name)->{
    5. return name.startsWith("张");
    6. }).forEach((String name)->{
    7. System.out.println("流中的元素" + name);
    8. });
    forEach方法

    void forEach(Consumer action):逐一处理流中的元素 参数 Consumer action:函数式接口,只有一个抽象方法:void accept(T t);

    注意:

    1.此方法并不保证元素的逐一消费动作在流中是有序进行的(元素可能丢失)

    2.Consumer是一个消费接口(可以获取流中的元素进行遍历操作,输出出去),可以使用Lambda表达式

    1. List<String> list = new ArrayList<>();
    2. list.add("张老三");
    3. list.add("张小三");
    4. list.add("李四");
    5. list.add("赵五");
    6. list.add("张六");
    7. list.add("王八");
    8. // 函数模型:获取流 --> 注意消费流中的元素
    9. list.stream().forEach((String name)->{
    10. System.out.println(name);
    11. });
    12. 输出结果:
    13. 张老三
    14. 张小三
    15. 李四
    16. 赵五
    17. 张六
    18. 王八
    limit方法

    Stream limit(long maxSize); 取用前几个元素

    注意:

    参数是一个long 类型,如果流的长度大于参数,则进行截取;否则不进行操作

    1. // 获取流的长度
    2. Stream<String> stream1 = Stream.of("张老三", "张小三", "李四", "赵五", "刘六", "王七");
    3. // 需求:保留前三个元素
    4. stream1.limit(3).forEach((String name)->{
    5. System.out.println("流中的前三个元素是:" + name);
    6. });
    7. 输出结果:
    8. 流中的前三个元素是:张老三
    9. 流中的前三个元素是:张小三
    10. 流中的前三个元素是:李四

    map方法

    Stream map(Function mapper; 参数Function:函数式接口,抽象方法:R apply(T t); Function:其实就是一个类型转换接口(T和R的类型可以一致,也可以不一致)

    1. // 获取Stream流
    2. Stream<String> stream1 = Stream.of("11","22","33","44","55");
    3. // 需求:把stream1流中的元素转换为int类型
    4. stream1.map((String s)->{
    5. return Integer.parseInt(s); //String类型的s进行转换为Integer类型的元素,并返回
    6. }).forEach((Integer i)->{
    7. System.out.println(i); // 将转换后的int类型的元素逐一输出
    8. });
    9. 输出结果:
    10. 11
    11. 22
    12. 33
    13. 44
    14. 55
    skip方法

    Stream skip(long n); 跳过前几个元素 注意: 如果流的当前长度大于n,则跳过前n个,否则将会得到一个长度为0的空流

    1. // 获取stream流
    2. Stream<String> stream = Stream.of("张老三", "张小三", "李四", "赵五", "刘六", "王七");
    3. stream.skip(3).forEach((String name)->{
    4. System.out.println("跳过前三个,打印剩下的" + name);
    5. });
    6. 输出结果:
    7. 跳过前三个,打印剩下的赵五
    8. 跳过前三个,打印剩下的刘六
    9. 跳过前三个,打印剩下的王七
    concat方法

    public static Stream concat(Stream a, Stream b) –> 合并两个流

    1. Stream<String> stream1 = Stream.of("11","22","33","44","55");
    2. Stream<String> stream2 = Stream.of("张颜宇", "张三", "李四", "赵五", "刘六", "王七");
    3. // 需求:合并两个流
    4. Stream<String> stream = Stream.concat(stream1,stream2);
    5. stream.forEach((String name)->{
    6. System.out.print(name);
    7. });
    8. 输出结果:
    9. 1122334455张颜宇张三李四赵五刘六王七
    收集Stream流 

    Stream流中提供了一个方法,可以把流中的数据收集到单例集合中

    R collect(Collector collector);

    把流中的数据手机到单列集合中 返回值类型是R。R指定为什么类型,就是手机到什么类型的集合 参数Collector中的R类型,决定把流中的元素收集到哪个集合中 参数Collector如何得到 ?,

    可以使用 java.util.stream.Collectors工具类中的静态方法:

    – public static Collector> toList():

    转换为List集合 – public static Collector> toSet() :转换为Set集合

    1. List<String> list2 = new ArrayList<>();
    2. list2.add("张老三");
    3. list2.add("张小三");
    4. list2.add("李四");
    5. list2.add("赵五");
    6. list2.add("张六");
    7. list2.add("王八");
    8. // 需求:过滤出姓张的并且长度为3的元素
    9. Stream<String> stream = list2.stream().filter((String name) -> {
    10. return name.startsWith("张");
    11. }).filter((String name) -> {
    12. return name.length() == 3;
    13. });
    14. // stream 收集到单列集合中
    15. List<String> list = stream.collect(Collectors.toList());
    16. System.out.println(list);
    17. // stream 手机到单列集合中
    18. Set<String> set = stream.collect(Collectors.toSet());
    19. System.out.println(set);

  • 相关阅读:
    windows环境下python连接openGauss数据库
    Jmeter之JSON提取器说明示例
    图论算法讲解
    51单片机系列-单片机定时器
    1、javaweb学习知识简析
    个性化推送通知的3种方法,提升60% ROI
    Python学习第4天:基础语句
    Java AtomicInteger 学习以及理解
    十八、完整神经网络模型验证步骤
    PaLM-E: An Embodied Multimodal Language Model
  • 原文地址:https://blog.csdn.net/weixin_53150299/article/details/132884533