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

相关文章
|
15天前
|
SQL Java 程序员
Java 8中的Stream API:简介与实用案例
【5月更文挑战第23天】本文将深入探讨Java 8中的Stream API,这是一种能够极大提升Java程序员生产力的新特性。我们将从基础概念开始,然后通过一些实用的案例来展示如何使用Stream API进行数据处理和操作。无论你是Java的初学者还是经验丰富的开发者,本文都将为你提供有价值的信息。
|
7天前
|
Java API
Java 8新特性之Lambda表达式和Stream API
【5月更文挑战第31天】本文将详细介绍Java 8中的两个重要特性:Lambda表达式和Stream API。通过对比传统编程方式,我们将探讨这两个特性如何简化代码、提高可读性和性能。文章还将通过实例演示如何使用Lambda表达式和Stream API进行集合操作、过滤和转换等任务。
|
8天前
|
Java API 数据处理
Java 8中的Stream API简介及其在数据处理中的应用
【5月更文挑战第30天】 本文旨在介绍Java 8中引入的Stream API,它是一种用于处理集合的新方法。与传统的循环和迭代器相比,Stream API提供了一种更简洁、高效的方式来处理数据。文章将详细介绍Stream API的基本概念、常用操作以及在实际项目中的应用场景。
|
8天前
|
Java API
Java 8新特性之Stream API详解
【5月更文挑战第30天】本文将详细介绍Java 8中的一个重要新特性——Stream API。Stream API是Java 8中引入的一种新的数据处理方式,它允许我们以声明式的方式处理数据,使得代码更加简洁、易读。文章将从Stream的基本概念、创建方式、常用操作以及实战案例等方面进行详细讲解,帮助读者深入理解并掌握Stream API的使用。
12 2
|
9天前
|
Java API
Java 8新特性之Lambda表达式与Stream API
【5月更文挑战第29天】本文将介绍Java 8中的两个重要特性——Lambda表达式和Stream API。Lambda表达式简化了函数式编程,使得代码更加简洁易读;而Stream API则为集合操作提供了更加高效且易于理解的方法。通过本文的学习,你将掌握这两个特性的基本用法,并了解如何在实际项目中应用它们。
|
9天前
|
安全 Java API
Java 8中的Stream API:简介与实用指南深入理解Java并发编程:线程安全与锁优化
【5月更文挑战第29天】本文旨在介绍Java 8中引入的Stream API,这是一种用于处理集合的新方法。我们将探讨Stream API的基本概念,以及如何使用它来简化集合操作,提高代码的可读性和效率。 【5月更文挑战第29天】 在Java并发编程中,线程安全和性能优化是两个核心议题。本文将深入探讨如何通过不同的锁机制和同步策略来保证多线程环境下的数据一致性,同时避免常见的并发问题如死锁和竞态条件。文章还将介绍现代Java虚拟机(JVM)针对锁的优化技术,包括锁粗化、锁消除以及轻量级锁等概念,并指导开发者如何合理选择和使用这些技术以提升应用的性能。
|
10天前
|
Java API
Java 8新特性之Lambda表达式与Stream API
【5月更文挑战第28天】本文将介绍Java 8中的两个重要特性:Lambda表达式和Stream API。Lambda表达式是一种新的语法特性,允许我们将函数作为参数传递给方法或者作为返回值。而Stream API是一种处理集合的新方式,它提供了一种高效且简洁的方式来处理数据。通过学习这两个特性,我们可以编写出更加简洁、高效的Java代码。
|
10天前
|
Java API 数据处理
Java 8新特性之Stream API详解
【5月更文挑战第28天】本文将详细介绍Java 8中的一个重要新特性——Stream API。Stream API是Java 8中引入的一种新的数据处理方式,它允许我们以声明式的方式处理数据,使得代码更加简洁、易读。文章将从Stream的基本概念、创建方式、常用操作以及使用场景等方面进行详细讲解,帮助读者深入理解并掌握Stream API的使用。
|
10天前
|
Java API 数据处理
Java 8新特性之Lambda表达式与Stream API
【5月更文挑战第28天】本文将介绍Java 8中的两个重要特性:Lambda表达式和Stream API。Lambda表达式是一种新的编程语法,可以使代码更加简洁、易读。而Stream API则是一种处理数据的新方法,可以让我们更高效地处理集合数据。通过学习这两个特性,我们可以编写出更加简洁、高效的Java代码。
|
10天前
|
Java API
Java 8新特性之Stream API详解
【5月更文挑战第28天】本文将详细解析Java 8中的一个重要新特性——Stream API。Stream API是Java 8引入的一种新的数据处理方式,它允许我们以声明性和函数式的方式处理数据。我们将详细介绍Stream API的基本概念,使用方法,以及如何使用它来简化我们的代码。