一文带你深入了解Java8 Stream流式编程

一文带你深入了解Java8 Stream流式编程

什么是Java 8 Stream

Java 8中引入了Stream API,通过Stream API,处理集合数据更加简单,更加高效。Stream API就如同一个迭代器(Iterator)一样,单向处理数据流并生成处理结果。

Stream接口可以让我们完成下面的任务:

  • 集合类型,比如 List,Set,甚至 Map 等等都可以做为 Stream 的数据源。
  • 数据处理操作,包括 filter,map,reduce,find,match ,排序等等。
  • 处理结果可以是 Stream类型,也可以是其他集合类型,比如 List,Set 或 Map等。

最基本使用

下面是一个最基本的Stream使用例子:

List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("cherry");
list.add("date");
list.add("grape");

list.stream()
    .filter(e -> e.startsWith("a"))
    .map(String::toUpperCase)
    .forEach(System.out::println); // 输出:APPLE

在这个例子中,我们创建了一个String类型的List,通过stream()方法获取数据流,使用filter()方法对数据流进行过滤,使用map()方法对过滤后的结果进行转换,使用forEach()方法进行输出。

中间操作

通常,Stream操作会分成两种:中间操作和最终操作。中间操作会返回一个新的Stream类型对象,所以支持链式调用,常用的中间操作有:

filter

filter方法可以用一个谓词来过滤出所有符合谓词的元素,比如下面这个例子:

Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Stream<Integer> evenNumbers = numbers.filter(n -> n % 2 == 0);
evenNumbers.forEach(System.out::println); // 输出:2 4 6 8 10

map

map方法可以用一个函数转换流中的每个元素,比如下面这个例子:

Stream<String> stream = Stream.of("java", "is", "cool");
Stream<String> upperStream = stream.map(String::toUpperCase);
upperStream.forEach(System.out::println); // 输出:JAVA IS COOL

flatMap

flatMap方法可以让我们将一个流中的内容映射为其他的Stream,将多个Stream中的数据合并到同一个Stream中,比如下面这个例子:

Stream<List<Integer>> stream = Stream.of(
        Arrays.asList(1, 2),
        Arrays.asList(3, 4, 5),
        Arrays.asList(6, 7, 8, 9)
);
Stream<Integer> flatStream = stream.flatMap(t -> t.stream());
flatStream.forEach(System.out::println); // 输出:1 2 3 4 5 6 7 8 9

sorted

sorted方法可以用来对流进行排序,比如下面这个例子:

Stream<String> stream = Stream.of("orange", "banana", "apple");
Stream<String> sortedStream = stream.sorted();
sortedStream.forEach(System.out::println); // 输出:apple banana orange

peek

peek方法可以用于调试Stream的中间操作结果,比如下面这个例子:

Stream<String> stream = Stream.of("apple", "banana", "cherry");
Stream<String> peekStream = stream.peek(System.out::println);
peekStream.forEach(System.out::println); // 输出:apple banana cherry

最终操作

最终操作会触发Stream的处理,常用的最终操作有:

forEach

forEach操作可以对每个元素进行处理,比如下面这个例子:

Stream.of(1, 2, 3, 4, 5)
        .filter(x -> x > 2)
        .forEach(System.out::println); // 输出:3 4 5

count

count操作可以统计Stream流长度,比如下面这个例子:

long count = Stream.of("apple", "banana", "cherry").count();
System.out.println(count); // 输出:3

toArray

toArray操作可以将Stream转化为一个数组,比如下面这个例子:

Stream<String> stream = Stream.of("apple", "banana", "cherry");
String[] array = stream.toArray(String[]::new);
System.out.println(Arrays.toString(array)); // 输出:[apple, banana, cherry]

reduce

reduce操作可以将流缩减为一个单独的结果,比如下面这个例子:

Optional<Integer> result = Stream.of(1, 2, 3).reduce((x, y) -> x + y);
System.out.println(result.get()); // 输出:6

collect

collect操作可以将Stream输出为集合,比如下面这个例子:

Stream<Integer> stream = Stream.of(1, 2, 3);
List<Integer> list = stream.collect(Collectors.toList());
System.out.println(list); // 输出:[1, 2, 3]

示例

下面是一个示例,通过Stream实现对一个List的排序和输出:

List<Person> persons = Arrays.asList(
        new Person("Tom", 10),
        new Person("Jerry", 20),
        new Person("Mike", 30),
        new Person("Joey", 40)
);

List<Person> sortedPersons = persons.stream()
        .sorted(Comparator.comparing(Person::getAge))
        .collect(Collectors.toList());

sortedPersons.forEach(System.out::println);

输出结果为:

Person{name='Tom', age=10}
Person{name='Jerry', age=20}
Person{name='Mike', age=30}
Person{name='Joey', age=40}

通过sort()方法可以排序List,通过Collectors.toList()方法可以将Stream转化为List。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文带你深入了解Java8 Stream流式编程 - Python技术站

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

相关文章

  • servlet之web路径问题_动力节点Java学院整理

    当开发Servlet时,我们通常会遇到一些Web路径相关的问题,这篇攻略将会详细讲解这些问题,并提供相应的解决方法。 1. Servlet中的Web路径问题 在Servlet中,一般涉及到两种类型的Web路径:绝对路径和相对路径。在处理这些路径时,我们需要了解以下内容: Web应用的根路径 Servlet映射路径 Servlet所在的包路径 1.1 Web应…

    Java 2023年6月16日
    00
  • 基于SpringMVC入门案例及讲解

    以下是关于“基于SpringMVC入门案例及讲解”的完整攻略,其中包含两个示例。 1. 前言 SpringMVC是一种常用的Java Web开发框架,其核心思想是基于MVC模式来实现Web应用程序开发。本攻略将详细讲解基于SpringMVC入门案例及讲解,包括SpringMVC的基本概念、配置方法以及一个示例。 2. SpringMVC的基本概念 以下是Sp…

    Java 2023年5月16日
    00
  • Java中@DateTimeFormat和@JsonFormat注解介绍

    当在Java中处理时间或日期数据时,我们常需要使用特定的格式将其转换成字符串或反向解析。而在Spring框架中,我们可以使用@DateTimeFormat和@JsonFormat两个注解来精细地控制时间和日期的格式化。下面将详细介绍这两个注解的使用方法和示例。 @DateTimeFormat注解介绍 1. 作用 @DateTimeFormat注解可以用于解析…

    Java 2023年5月20日
    00
  • (starters)springboot-starter整合阿里云datahub方式

    完整攻略:Spring Boot整合阿里云DataHub 一、前置条件在开始整合之前,需要先确保以下几个条件: 阿里云账号及DataHub服务我们需要一个已开通DataHub服务的阿里云账号,假设我们已有一个名为”test-datahub”的DataHub项目。 工具准备a) Maven及Java IDE(本文以Intellij IDEA为例)b) 阿里云S…

    Java 2023年5月20日
    00
  • Java 对象在 JVM 中的内存布局超详细解说

    来看一下Java对象在JVM中的内存布局超详细解说的完整攻略。 概述 在Java中,对象是通过new关键字来创建的。当创建对象时,JVM会在堆(heap)中分配一块连续的内存空间,用来存储该对象的实例变量。这个连续的内存空间被称为Java对象的实例数据。 Java对象在JVM中的内存布局主要可以分为以下三个部分: 对象头(Object Header):对象头…

    Java 2023年5月26日
    00
  • 详解tomcat部署静态html网站方法

    下面我将为你详细讲解“详解tomcat部署静态html网站方法”的完整攻略。 步骤一:下载和安装Tomcat服务器 首先需要下载Tomcat服务器并安装到本地。 步骤二:创建静态html网站文件夹 在本地创建一个文件夹,用于存放静态html网站的相关文件。例如,我们可以创建一个名为“mywebsite”的文件夹,用于存储我们的静态html网站文件。 步骤三:…

    Java 2023年5月19日
    00
  • 利用weixin-java-miniapp生成小程序码并直接返回图片文件流的方法

    生成小程序码并直接返回图片文件流的方法,需要使用weixin-java-miniapp这个专门用于小程序开发的Java SDK。 以下是详细步骤: 步骤一:添加依赖 在pom.xml文件中添加weixin-java-miniapp的依赖: <dependency> <groupId>com.github.binarywang</…

    Java 2023年5月23日
    00
  • java发送邮件示例讲解

    当我们需要在Java应用程序中发送邮件时,可以使用JavaMail API。 JavaMail是一个Java电子邮件API,可用于向收件人发送电子邮件。 它是由Oracle Corporation开发的,并且作为Java EE平台的一部分发布。 要在Java中发送邮件,必须连接到SMTP(简单邮件传输协议)服务器。 JavaMail API提供了JavaMa…

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