Stream-JDK8

Stream概念 

代码示例 

package com.zz.stream;

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

/**
 * 使用Stream流
 * 找出姓张并且是三个字的名字
 */
public class Test {
    public static void main(String args[]){
        List<String> names = new ArrayList <>();
        Collections.addAll(names, "张无忌", "赵四", "张三", "李四", "张缘结");
        System.out.println(names);

        //使用原始方法
        List<String> list = new ArrayList <>();
        for (String name:names) {
            if(name.startsWith("张") && name.length() == 3){
               list.add(name);
            }
        }
        System.out.println(list);

        //使用Stream流
        List<String> list1 = names.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).collect(Collectors.toList());
        System.out.println(list1);
    }
}
  1. names.stream(): 这部分将names列表转换成一个流(Stream)。流是Java 8中引入的一个新特性,它允许你以声明性方式处理数据集合(如列表、集合等)。

  2. filter(s -> s.startsWith("张")): 第一个filter方法用于过滤流中的元素。它接受一个Predicate(谓词),该谓词是一个函数式接口,用于定义一个测试条件。在这里,谓词是一个lambda表达式s -> s.startsWith("张"),它检查每个字符串是否以“张”开头。只有满足这个条件的字符串才会被保留在流中。

  3. filter(s -> s.length() == 3): 第二个filter方法再次过滤流中的元素。它使用了另一个lambda表达式s -> s.length() == 3作为谓词,该谓词检查每个字符串的长度是否为3。只有长度为3的字符串才会被保留在流中。

需要注意的是,这里连续调用了两次filter方法。流中的每个元素首先会经过第一个filter方法的检查,然后再经过第二个filter方法的检查。只有同时满足这两个条件的元素才会被保留。

  1. collect(Collectors.toList()): 最后,collect方法用于将过滤后的流收集到一个新的列表中。Collectors.toList()是一个收集器(Collector),它告诉collect方法如何收集流中的元素。在这个例子中,它将流中的元素收集到一个新的List中。

Stream流的使用步骤 

1.获取Stream流

  1.  List集合获取Stream流
  2. Map集合获取Stream流
  3. Set集合获取Stream流
  4. 数组获取Stream流

代码示例

package com.zz.stream;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Test2 {
    public static void main(String args[]){
        //1.集合获取Stream流
        List<String> names = new ArrayList <>();
        Collections.addAll(names, "刘德华", "朱子晴", "朱德", "郭富城");
        List<String> list = names.stream().filter(s -> s.contains("德")).collect(Collectors.toList());
        System.out.println(list);

        //2.Set集合获取Stream流
        Set<String> set = new HashSet <>();
        Collections.addAll(set, "刘德华", "朱子晴", "朱德", "郭富城");
        Stream<String> stream = set.stream();
        stream.filter(s -> s.contains("朱")).forEach(s -> System.out.println(s));

        //使用Map集合获取Stream流
        Map<String, Double> map = new HashMap <>();
        map.put("白骨精", 145.9);
        map.put("牛魔王", 180.3);
        map.put("孙悟空", 156.4);
        /**
         * Map集合不能直接获取Stream流
         * 解决方法
         * 1.通过Set<String> keys = map.keySet();获取键流
         *  Collection<Double> values = map.values();获取值流
         *  2.使用Entry封装键值对:Set<Map.Entry<String, Double>> entries = map.entrySet();
         */
        Set<String> keys = map.keySet();
        Stream<String> ks = keys.stream();//获取到键的流

        Collection<Double> values = map.values();
        Stream<Double> vs = values.stream();

        Set<Map.Entry<String, Double>> entries = map.entrySet();
        Stream<Map.Entry<String, Double>> kvs = entries.stream();
        kvs.filter(e -> e.getKey().contains("牛")).forEach(s -> System.out.println(s.getKey() + "=" + s.getValue()));

        //数组获取Stream流
        String[] names2 = {"张护", "妞儿", "bab"};
        Stream<String> s1 = Arrays.stream(names2);
        Stream<String> s2 = Stream.of(names2);
    }
}

2.Stream常用的中间方法

 3.Stream流常见的终结方法

 

注意:流只能收集一次 

相关推荐

  1. JDK8 stream toMap方法介绍

    2024-03-14 14:14:04       49 阅读
  2. vmware安装centos8-stream

    2024-03-14 14:14:04       57 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-14 14:14:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-14 14:14:04       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-14 14:14:04       82 阅读
  4. Python语言-面向对象

    2024-03-14 14:14:04       91 阅读

热门阅读

  1. Linux SHELL脚本编程

    2024-03-14 14:14:04       45 阅读
  2. wrap:包装

    2024-03-14 14:14:04       35 阅读
  3. RocketMQ之基于Docker安装

    2024-03-14 14:14:04       44 阅读
  4. virtual-pc/VMware/bochs的区别

    2024-03-14 14:14:04       46 阅读
  5. 数据库设计三范式

    2024-03-14 14:14:04       48 阅读
  6. Unix运维_CMake教程_CMake中的link_libraries指令

    2024-03-14 14:14:04       39 阅读
  7. springBean的三种实例化

    2024-03-14 14:14:04       42 阅读
  8. Kubernetes kafka系列 | k8s部署kafka+zookeepe集群

    2024-03-14 14:14:04       30 阅读
  9. boost 压缩与解压缩流

    2024-03-14 14:14:04       37 阅读