Java基础之Stream流原理与用法详解

Java基础之Stream流原理与用法详解

1. 什么是Stream流?

Stream流是Java 8中引入的一种新的API,它允许我们在集合上进行的函数式操作。它使我们能够以声明式方式处理集合中的元素,而不是直接以循环形式迭代它们。在Java 8之前,Collections类提供了大量用于操作集合的方法。但是,为了使用这些方法,你必须在代码中写出来循环,这增加了代码中的错误可能性。Stream流则可以使我们省略掉这种循环。利用Stream流,我们可以在集合中执行过滤、映射、缩减等一系列操作,而不用写复杂的循环。

2. Stream流的特点

Stream流有以下几个特点:

  • Stream流本质上是一个序列,可以按需计算。
  • Stream流不会修改原始数据源,它会创建一份新的数据源来存储结果。
  • Stream流可以是无限的,也可以是有限的。
  • Stream流可以通过过滤、映射、缩减、排序等操作进行处理。

3. Stream流用法详解

下面我们将逐个解释Stream流中最常见的方法。

3.1 创建一个Stream流

Stream流可以通过两种方式进行创建:

3.1.1 通过集合创建Stream

你可以通过集合的stream()方法获取一个Stream流,该方法返回一个流类型的对象。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> stream = list.stream();
或
Stream<Integer> stream = Arrays.stream(new Integer[]{1, 2, 3, 4, 5});

3.1.2 通过Stream.of()方法创建Stream

你可以通过Stream类的of()方法,将元素转化为Stream流。

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);

3.2 中间操作

在使用Stream流时,可以通过多种中间操作对集合元素进行处理和转换。

3.2.1 filter()方法

filter()方法用于对Stream流中的元素进行过滤。该方法接收一个Lambda表达式,该表达式的计算结果必须是一个boolean类型的值(true或者false)。如果表达式返回true,则元素会被保留在Stream流中;如果返回false,则元素会被过滤掉。

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
stream.filter(num -> num % 2 == 0)
      .forEach(System.out::println);

上述代码将筛选出Stream中的偶数,输出结果为:

2
4

3.2.2 map()方法

map()方法用于将Stream流中的元素按照指定的方式进行转换,该方法接收一个Lambda表达式,它将?入的元素转化为另?一个元素,输出这个结果。

Stream<String> stream = Stream.of("hello world", "good morning", "hi");
stream.map(value -> value.toUpperCase())
      .forEach(System.out::println);

上述代码将Stream中的每个字符串元素转换为大写形式,输出结果为:

HELLO WORLD
GOOD MORNING
HI

3.2.3 limit()方法

limit()方法用于截取Stream流中的前n个元素。n的值由你指定。例如:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
stream.limit(3)
      .forEach(System.out::println);

输出结果:

1
2
3

3.2.4 sorted()方法

sorted()方法用于对Stream流中的元素进行排序。当然,排序的时候需要指定排序规则,你可以在方法中传递一个Comparator对象或者使用自然排序(自然排序是指比较元素是否实现了Comparable接口,如果实现了就进行比较)。

Stream<Integer> stream = Stream.of(3, 1, 4, 2, 5);
stream.sorted()
      .forEach(System.out::println);
或
Stream<String> stream = Stream.of("c", "a", "b", "d");
stream.sorted((a, b) -> a.compareTo(b))
      .forEach(System.out::println);

输出结果:

1
2
3
4
5
a
b
c
d

3.2.5 distinct()方法

distinct()方法用于去重Stream流中的元素。该方法将重复的元素去掉,只留下不同的元素。去重的规则是使用元素的equals()方法进行比较。

Stream<Integer> stream = Stream.of(1, 2, 3, 2, 4, 5, 4, 6);
stream.distinct()
      .forEach(System.out::println);

输出结果:

1
2
3
4
5
6

3.2.6 peek()方法

peek()方法用于Stream流操作时调试,它可以在Stream流每个元素执行完操作后,在不修改流中元素的情况下输出某些信息。peek()方法的主要目的是用来调试,在开发时排查问题。

Stream<Integer> stream = Stream.of(1, 2, 3);
stream.peek(System.out::println)
      .forEach(System.out::println);

输出结果:

1
1
2
2
3
3

3.3 终止操作

在Stream流的处理完成后,需要执行终止操作才能将Stream流处理完成,终止操作将最终的结果输出到目标中。

3.3.1 forEach()方法

forEach()方法用于对Stream流的每个元素进行执行操作,通常和中间操作配合使用,可以完成一些任务。

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
stream.filter(num -> num % 2 == 0)
      .forEach(System.out::println);

上述代码将筛选出Stream中的偶数,并将筛选结果输出,输出结果为:

2
4

3.3.2 count()方法

count()方法用于对Stream流中的元素数进行统计。该方法返回一个long类型的值,表示Stream流中元素的个数。

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
long count = stream.count();
System.out.println(count);

输出结果:

5

好了,以上就是Stream流的详细用法介绍,如果你还想深入了解Stream流的其他用法,可以查阅Java 8官方文档。

4. 示例说明

下面我们通过两个示例来详细说明Stream流的使用。

4.1 Stream流用于对List进行筛选

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = list.stream()
                            .filter(num -> num % 2 == 0)
                            .collect(Collectors.toList());
System.out.println(result);

上述代码将筛选出list中的偶数元素,并将结果输出,输出结果为:

[2, 4]

4.2 Stream流用于对Map进行筛选

Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
map.put("d", 4);
map.put("e", 5);

Map<String, Integer> result = map.entrySet().stream()
                                    .filter(entry -> entry.getValue() % 2 == 0)
                                    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
System.out.println(result);

上述代码将筛选出map中的值为偶数的key-value键值对,并将结果输出,输出结果为:

{b=2, d=4}

以上就是两个Stream流的使用实例,可以根据具体业务需求来选择不同的Stream流操作方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java基础之Stream流原理与用法详解 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 时间处理函数工具分享(时间戳计算)

    下面是“时间处理函数工具分享(时间戳计算)”的完整攻略。 时间戳的概念 时间戳(Timestamp)是指格林威治时间1970年01月01日00时00分01秒(北京时间1970年01月01日08时00分01秒)起至现在的总秒数。时间戳是一种以简洁、统一的方式表示时间的方式,通常被用于记录事件发生的时间或进行时间计算。 Javascript中的时间处理 获取当前…

    Java 2023年5月20日
    00
  • Spring Data Jpa 复杂查询方式总结(多表关联及自定义分页)

    下面就是 Spring Data JPA 复杂查询方式的攻略: 概述 Spring Data JPA 提供 JPA 规范标准的数据访问方式,并简化了持久层的开发。在实际应用场景中,有些查询需要多表关联及自定义分页方式。 本文将介绍 Spring Data JPA 多表关联及自定义分页的实现方式。 多表关联查询 基于 JPA 查询 在 JPA 中,我们可以通过…

    Java 2023年6月2日
    00
  • Java读写文件创建文件夹多种方法示例详解

    请您先到我的网站上查看该文章的具体内容,以便更好地理解我的回答,并方便您对我的回答进行参考对照:Java读写文件创建文件夹多种方法示例详解 首先,本文中提到了多种文件读写方法,包括字节流,字符流及NIO方式。在进行文件读写操作前,需首先声明文件路径,一般会使用java.io.File类来表示文件或者目录。文件读写时,需要指定文件的输入流或输出流。在Java中…

    Java 2023年5月20日
    00
  • 浅谈Java字符串比较的三种方法

    浅谈Java字符串比较的三种方法 在Java中,字符串的比较是很常见的操作。本文将介绍三种Java字符串比较的方法:比较运算符、equals()方法和compareTo()方法,并且将会给出一些示例来让我们更好地理解它们。 比较运算符 比较运算符在Java中可以用来比较两个字符串的字典顺序,具有良好的可读性。判断两个字符串是否相等,我们可以使用“==”,代码…

    Java 2023年5月26日
    00
  • Spring Boot JPA访问Mysql示例

    下面我详细讲解一下Spring Boot JPA访问Mysql的完整攻略,包含以下几个步骤: 1. 创建Spring Boot项目 首先要创建一个Spring Boot项目,你可以使用官方的Spring Initializr来快速创建一个基础框架。选择Maven或Gradle项目管理方式和需要的依赖,例如: Spring Web Spring Data JP…

    Java 2023年5月20日
    00
  • 通过Java连接SQL Server数据库的超详细操作流程

    接下来我将为您详细介绍通过Java连接SQL Server数据库的超详细操作流程。 1. 配置jar包 要使用Java连接SQL Server数据库,需要获取Microsoft提供的Java连接SQL Server的jar包。在此,我们使用Microsoft针对Java的开发插件:Microsoft JDBC Driver for SQL Server。Ja…

    Java 2023年5月20日
    00
  • jsp+servlet实现最简单的增删改查代码分享

    下面来详细讲解 JSP+Servlet 实现最简单的增删改查代码分享的完整攻略。 1. 准备工作 在开始编写代码之前,需要先准备好以下工具和环境: JDK 1.8 或以上版本 Tomcat 8 或以上版本 Eclipse 或其他 Java IDE 2. 创建项目 在 Eclipse 中创建新的动态 Web 项目,选择 Web Application 项目类型…

    Java 2023年6月15日
    00
  • java 8 lambda表达式中的异常处理操作

    下面是“Java 8 Lambda表达式中的异常处理操作”的详细攻略。 什么是Lambda表达式中的异常处理操作 在Java 8中,Lambda表达式是一种新的语言特性,可以将一个方法作为参数传递给另一个方法,从而实现更加简洁、灵活的编程方式。在使用Lambda表达式时,有时会出现异常问题,因此需要进行异常处理操作,以保证代码的健壮性。 Lambda表达式中…

    Java 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部