Java的 Stream流

简介: Java的 Stream流
  • Stream流?

结合Lambda表达式,用于简化集合和数组操作的API。

  • Stream流的一个小例子:
  • 创建一个集合,存储多个姓名,把集合中所有以"张"开头的长度为3的元素存储到一个新的集合并输出。
List<String> names=new ArrayList<>();
        Collections.addAll(names,"张若虚","张仲景","李白","王维","张三");
        System.out.println(names);
//非Stream流
        //find zhang
        List<String> zhang=new ArrayList<>();
        for (String name : names) {
            if(name.startsWith("张"))
                zhang.add(name);
        }
        System.out.println(zhang);
        //find length is 3
        List<String> three=new ArrayList<>();
        for (String name : names) {
            if(name.length()==3)
                three.add(name);
        }
        System.out.println(three);
//Stream流
        //stream way           lambda表达式
        names.stream().filter(s -> s.startsWith("张")).filter(s->s.length()==3).forEach(s -> System.out.println(s));

可以看到通过Stream流方法代码简化到一行了。对于这一行Stream流方法代码可以分为三类方法:获取Stream流方法、中间方法、终结方法。

获取Stream流方法

  • 集合得到Stream流:使用Stream()方法,例如示例的 names.stream()
  • 数组得到Stream流:a,使用Stream()方法;b,使用Stream.of()
//1
        Collection<String> list=new ArrayList<>();
        Stream<String> Streamlist=list.stream();
        //2
        Map<String,Integer> maps=new HashMap<>();
        Stream<String> StreamKey=maps.keySet().stream();//键的流
        Stream<Integer> StreamVal=maps.values().stream();//值的流
        Stream<Map.Entry<String,Integer>> StreamMaps=maps.entrySet().stream();//键值对的流
        //3
        Integer[] a={1,2,3,4,5};
        Stream<Integer> ast= Arrays.stream(a);//a
        Stream<Integer> ast2=Stream.of(a);//b

中间方法

中间方法也称为非终结方法,调用完成后返回新的Stream流,支持链式编程。

常用中间方法API:

filter:对流中的数据进行过滤。

limit:获取前几个元素。

skip:跳过前几个元素。

distinct:去除流中重复的元素(hashCode和equals)。

concat:合并两个流。

Stream流中无法直接修改集合、数组中的数据。

终结方法

终结方法后流不可以继续使用

//执行示例的非终结流输出
System.out.println(names.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3));
System.out.println(names.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).count());
//控制台:
java.util.stream.ReferencePipeline$2@3d075dc0
2

就是说没有添加终结方法会返回一个流stream,添加添加终结方法会返回具体内容。

常见终结操作:

forEach:流的每个元素执行遍历操作。

count:返回流中的元素数。

end.收集Stream流

把Stream流操作后的结果数据转回到集合或者数组中去,因为Stream流中无法直接修改集合、数组中的数据。

Stream流是方便操作集合、数组的手段,集合、数组才是目的。

一般方法:collect (可变集合)

具体方法:toList、toSet、toMap、toArray;

//继续示例的流:
        Stream<String> str=names.stream().filter(s -> s.startsWith("张")).filter(s->s.length()==3);
        List<String> z3List=str.collect(Collectors.toList());//collect
        List<String> z3List2=str.toList();//toList
        Object[] arrs=str.toArray();//toArray

其中toArray可以指定返回的对象类型,就可不使用Object来接收了。

String[] arrs=str.toArray(new IntFunction<String[]>() {
            @Override
            public String[] apply(int value) {
                return new String[0];
            }
        });

!流只能使用一次,收集完就没了

stream has already been operated upon or closed

相关文章
|
4月前
|
Java API 数据处理
Java新特性:使用Stream API重构你的数据处理
Java新特性:使用Stream API重构你的数据处理
|
4月前
|
Java 大数据 API
Java Stream API:现代集合处理与函数式编程
Java Stream API:现代集合处理与函数式编程
286 100
|
4月前
|
Java API 数据处理
Java Stream API:现代集合处理新方式
Java Stream API:现代集合处理新方式
318 101
|
4月前
|
并行计算 Java 大数据
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
270 101
|
5月前
|
存储 Java API
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
387 188
|
5月前
|
存储 Java API
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
306 92
|
3月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
210 1
|
6月前
|
Oracle Java 关系型数据库
掌握Java Stream API:高效集合处理的利器
掌握Java Stream API:高效集合处理的利器
422 80
|
6月前
|
安全 Java API
Java 8 Stream API:高效集合处理的利器
Java 8 Stream API:高效集合处理的利器
327 83
|
4月前
|
存储 数据可视化 Java
Java Stream API 的强大功能
Java Stream API 是 Java 8 引入的重要特性,它改变了集合数据的处理方式。通过声明式语法,开发者可以更简洁地进行过滤、映射、聚合等操作。Stream API 支持惰性求值和并行处理,提升了代码效率和可读性,是现代 Java 开发不可或缺的工具。
104 0
Java Stream API 的强大功能