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

相关文章
|
18天前
|
安全 Java 大数据
|
21天前
|
SQL 存储 Java
java流式计算Stream
java流式计算Stream
12 0
|
1月前
|
Java API
掌握Java 8 Stream API的艺术:详解流式编程(三)
掌握Java 8 Stream API的艺术:详解流式编程
16 2
|
18天前
|
Java Unix Windows
|
1天前
|
Java 程序员 API
Java 8新特性之Lambda表达式与Stream API的深度解析
【5月更文挑战第12天】本文将深入探讨Java 8中的两个重要新特性:Lambda表达式和Stream API。我们将从基本概念入手,逐步深入到实际应用场景,帮助读者更好地理解和掌握这两个新特性,提高Java编程效率。
12 2
|
3天前
|
Java API
【JAVA进阶篇教学】第三篇:JDK8中Stream API使用
【JAVA进阶篇教学】第三篇:JDK8中Stream API使用
|
12天前
|
分布式计算 Java API
Java 8新特性之Lambda表达式与Stream API
【5月更文挑战第1天】本文将介绍Java 8中的两个重要特性:Lambda表达式和Stream API。Lambda表达式是一种新的函数式编程语法,可以简化代码并提高可读性。Stream API是一种用于处理集合的新工具,可以方便地进行数据操作和转换。通过结合Lambda表达式和Stream API,我们可以更加简洁高效地编写Java代码。
|
13天前
|
Java
Java8 Stream Collectors groupingBy使用
Java8 Stream Collectors groupingBy使用
|
16天前
|
Java API 开发者
【专栏】Java 8的Stream API是处理集合数据的新方式,强调简洁和声明式编程
【4月更文挑战第27天】Java 8的Stream API是处理集合数据的新方式,强调简洁和声明式编程。它基于延迟执行和惰性求值,提供创建、中间操作(如filter、map)和终端操作(如forEach、collect)。示例展示了如何通过Stream排序、过滤、映射和聚合数据。
|
17天前
|
Java 编译器 API
Java基础教程(17)-Java8中的lambda表达式和Stream、Optional
【4月更文挑战第17天】Lambda表达式是Java 8引入的函数式编程特性,允许函数作为参数或返回值。它有简洁的语法:`(parameters) -> expression 或 (parameters) ->{ statements; }`。FunctionalInterface注解用于标记单方法接口,可以用Lambda替换。