Java 8 Stream操作类型及peek示例解析

Java 8 Stream操作类型及peek示例解析

Java 8引入了Stream API,可用于对集合和数组进行函数式操作。本篇攻略将介绍Java 8中Stream API的操作类型,并详细讲解peek()操作的定义、用法和示例。

Stream API操作类型

Stream API包含两种类型的操作:Intermediate(中间操作)和Terminal(终端操作)。

Intermediate操作

Intermediate操作返回一个Stream并可以链式连接,常见Intermediate操作有:filter、map、flatMap、distinct、sorted、peek等。

Terminal操作

Terminal操作将Stream转换为另一个类型的值,并且返回结果,一旦Terminal操作执行完成,Stream将关闭,常见Terminal操作有:forEach、count、reduce、collect、anyMatch、allMatch、noneMatch等。

peek()操作

peek()方法被用于调试和测试,在每个元素恰好消耗一次时,它能够提供Stream操作元素的中间状态信息。

定义

peek()是一个Intermediate操作,它接收一个Consumer类型的lambda参数(void类型),对每个元素执行操作并返回一个新的Stream,并可以继续进行流的操作。peek()方法不会影响原始流中的元素。

用法

Stream.peek()方法的语法如下所示:

Stream<T> peek(Consumer<? super T> action)

其中,action是一个可以应用到每个元素上的void类型Lambda表达式,可以使用peek()方法进行调试和测试。

示例1

下面,让我们来看一下如何使用peek()方法。

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

List<Integer> result = numbers.stream()
    .peek(x -> System.out.println("From stream: " + x))
    .map(x -> x * 2)
    .peek(x -> System.out.println("After map: " + x))
    .filter(x -> x > 4)
    .peek(x -> System.out.println("After filter: " + x))
    .collect(Collectors.toList());

代码中,我们使用peek()方法输出每个元素的中间状态信息,例如:从流中、map操作之后、filter操作之后,然后将结果保存在一个List中。

运行程序,输出结果如下:

From stream: 1
After map: 2
From stream: 2
After map: 4
From stream: 3
After map: 6
From stream: 4
After map: 8
From stream: 5
After map: 10
After filter: 6
After filter: 8
After filter: 10

可以看到,peek()方法在每次操作之后都会输出目前流的中间状态。

示例2

接下来,我们再来看一个稍微复杂一些的示例,演示如何使用peek()方法创建并调试一个自定义Collector。

public class Person {
    private String name;
    private Integer age;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public Integer getAge() {
        return age;
    }
}

public class MyCollector<T> implements Collector<T, List<T>, List<T>> {

    @Override
    public Supplier<List<T>> supplier() {
        return ArrayList::new;
    }

    @Override
    public BiConsumer<List<T>, T> accumulator() {
        return List::add;
    }

    @Override
    public BinaryOperator<List<T>> combiner() {
        return (list1, list2) -> {
            list1.addAll(list2);
            return list1;
        };
    }

    @Override
    public Function<List<T>, List<T>> finisher() {
        return Function.identity();
    }

    @Override
    public Set<Characteristics> characteristics() {
        return Collections.emptySet();
    }
}

List<Person> persons = Arrays.asList(
    new Person("Tom", 20),
    new Person("James", 18),
    new Person("Lucas", 30)
);

List<Person> result = persons.stream()
    .peek(x -> System.out.println("From stream: " + x))
    .filter(p -> p.getAge() >=20)
    .peek(x -> System.out.println("After filter: " + x))
    .map(x -> new Person(x.name.toUpperCase(), x.age))
    .peek(x -> System.out.println("After map: " + x))
    .collect(new MyCollector<>());

System.out.println(result);

代码中,我们定义一个Person类和一个自定义的Collector MyCollector。然后我们想要从列表中选出年龄大于或等于20岁的人物,对他们进行大写名称的转换,最后使用自定义Collector进行收集,并输出结果。

运行程序,输出结果如下:

From stream: Person{name='Tom', age=20}
After filter: Person{name='Tom', age=20}
After map: Person{name='TOM', age=20}
From stream: Person{name='James', age=18}
From stream: Person{name='Lucas', age=30}
After filter: Person{name='Lucas', age=30}
After map: Person{name='LUCAS', age=30}
[Person{name='TOM', age=20}, Person{name='LUCAS', age=30}]

可以看出,peek()方法成功帮助我们调试,并得到需要的结果。

结论

在使用Stream API处理集合和数组时,peek()方法可用于调试和测试,输出每个元素的中间状态信息,方便地追踪操作过程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 8 Stream操作类型及peek示例解析 - Python技术站

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

相关文章

  • Java、JavaScript、Oracle、MySQL中实现的MD5加密算法分享

    Java、JavaScript、Oracle、MySQL中实现的MD5加密算法分享 简介 MD5是一种常用的密码加密算法,用于将用户输入的密码在存储到数据库中之前进行加密,保证密码的安全性。该算法将任意长度的“消息”(message)表示为一个128位的“消息摘要”(message digest),常用来保证信息传输的完整性和单向加密。 在本篇文章中,我们将…

    Java 2023年5月20日
    00
  • MyBatis详细执行流程的全纪录

    MyBatis详细执行流程的全纪录 MyBatis是一款基于Java的持久层框架,提供了丰富的SQL映射支持和灵活的结果映射配置。本文将介绍MyBatis的执行流程,并通过两个示例来详细讲解。 执行流程 MyBatis的执行流程主要分为以下几个步骤: 加载配置文件:MyBatis的配置文件包含了一系列的配置信息,例如数据库连接信息、SQL映射文件的位置和类型…

    Java 2023年5月20日
    00
  • 详解spring boot集成ehcache 2.x 用于hibernate二级缓存

    下面是详解”spring boot集成ehcache 2.x 用于hibernate二级缓存”的完整攻略。 引言 在使用Spring Boot开发项目时,我们往往需要使用到缓存来提高性能。而使用Hibernate框架时,我们可以通过集成Ehcache来实现二级缓存。本文将详细介绍在Spring Boot项目中,如何集成Ehcache 2.x用于Hiberna…

    Java 2023年5月20日
    00
  • 浅谈Java安全编码之文件和共享目录的安全性

    浅谈Java安全编码之文件和共享目录的安全性 背景 在Java应用程序中,对文件和共享目录的访问是很常见的操作。然而,由于文件和共享目录是系统中的敏感资源,需要注意相关的安全问题。本文将讲解如何在Java应用程序中安全地使用文件和共享目录。 文件和共享目录的安全问题 数据隐私 应用程序中的文件和共享目录可能包含敏感的数据,如密码、密钥等,一旦泄漏,将可能引发…

    Java 2023年5月19日
    00
  • Java基础教程之八大基本数据类型

    Java基础教程之八大基本数据类型 在Java中,基本数据类型指的是不同类型的数据的原始值,它们是Java程序设计的基础。Java中有八种基本数据类型,分别是: byte:8位有符号整数,取值范围为-128到127; short:16位有符号整数,取值范围为-32768到32767; int:32位有符号整数,取值范围为-2147483648到2147483…

    Java 2023年5月26日
    00
  • Java实现“年-月-日 上午/下午时:分:秒”的简单代码

    这里提供两种 Java 实现 “年-月-日 上午/下午时:分:秒” 格式代码的方法。 方法一:使用 SimpleDateFormat 类 import java.text.SimpleDateFormat; import java.util.Date; public class DateFormatDemo { public static void main…

    Java 2023年5月20日
    00
  • MyBatis框架之mybatis逆向工程自动生成代码

    MyBatis框架之mybatis逆向工程自动生成代码完整攻略 什么是逆向工程 逆向工程是指通过数据库的表结构自动生成Java代码的过程。在Web开发中,Java开发人员通常会和数据库打交道,而每次手写一个POJO类、DAO类和Mapper文件比较繁琐,如果能够快速地生成这些代码,开发效率可以得到显著提升。MyBatis框架提供了逆向工程工具用于自动生成Ja…

    Java 2023年5月20日
    00
  • SpringBoot控制配置类加载顺序方式

    SpringBoot是一个基于Spring框架的开源应用程序开发框架,主要用于快速构建基于Spring的企业级应用程序。而SpringBoot中一个非常重要的机制就是使用控制配置类进行应用程序的配置。控制配置类可以通过多种方式进行加载,这里我们就详细讲解一下SpringBoot控制配置类加载顺序方式以及相应实例。 控制配置类的加载顺序方式 SpringBoo…

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