爪哇 8流 API深入指南

在这篇文章中,我们将看到Java 8流的深入概述,其中包含许多示例和练习。

介绍

You may think that Stream must be similar to InputStream or OutputStream, but that’s not the case.

A represents a sequence of elements supporting sequential and parallel aggregate operations. Stream does not store data, it operates on source data structures such as List, 采集,数组等

大多数流操作接受 功能接口 这使其成为lambda表达式的理想选择。

如果您不熟悉功能接口,lambda表达式和竞彩篮球分析引用,则可能需要先阅读以下教程,然后再继续。

流操作的类型

流操作有两种类型。

  1. Intermediate operations: 返回一个流,该流可以与其他通过dot进行的中间操作链接在一起。
  2. Terminal operations: 返回void或非流输出。

让’通过简单的示例了解。

输出:

约翰
MARTIN
MARY
STEVE

这里,
To perform a computation, stream operations are built into a Stream pipeline. 流 pipeline consists of:

  1. source
  2. zero or more intermediate operations
  3. terminal operation.

在我们的示例中,Stream管道包括:
Source:字符串列表
1 Intermediate operation:地图
1 terminal operation:forEach

下图将使其更加清晰。
地图 is intermediate operation and 前言 is terminal opertion.
流基础

大多数流操作接受描述用户定义的行为的参数,例如 lambda表达式 地图((s)->s.toUpperCase()) 传递给地图操作。

为了获得正确的行为,流参数应为:
non-interfering: 在执行Stream管线时,不应修改流源。您可以了解更多有关 干扰.
Stateless: 在大多数情况下,lambda表达式应该是无状态的。其输出不应取决于在Stream流水线执行期间可能改变的状态。我已经讲过 有状态lambda表达式 在并行流教程中。

流创建

有多种创建流的竞彩篮球分析。

空流

空的() 竞彩篮球分析可用于创建空流。

通常用于返回零元素而不是null的Stream。

收集流

流 can be created from Collection by calling .stream() or .parallelStream()

stringList.stream() 将返回常规对象流。

你不’无需创建集合即可获取Stream。您也可以使用 。的()

流.generate()

生成()竞彩篮球分析接受 供应商 用于元素生成。它创建无限的Stream,您可以通过调用limit()函数对其进行限制。

这将创建具有10个值为1的Integer流。

流.iterate()

流.iterate()也可用于生成无限流。

First parameter of iterate method represents first element of the Stream. All the following elements will be generated by lambda expression n->n+1 and limit() is used to convert infinite Stream to finite Stream with 5 elements.

懒惰评估

流是懒惰的;在遇到终端操作之前,不执行中间操作。

每个中间操作都会生成一个新流,并存储提供的操作或功能。当调用终端操作时,流管线执行开始,并且所有中间操作都一一执行。

让’借助示例可以理解:

在前面的输出中,您可以看到,除非且直到调用了终端操作计数,否则控制台上什么都没有打印。

In the preceding example, peek() method is used to print the element of stream. 窥视() method is generally used for logging and debugging purpose only.

操作顺序

让’看流如何处理操作顺序。
您能猜出程序的输出吗?

输出将是:

Map: mohan
Filter: MOHAN
Map: john
Filter: JOHN
JOHN

这里的操作顺序可能令人惊讶。一种常见的竞彩篮球分析是对所有元素执行中间操作,然后执行下一个操作,但每个元素都垂直移动。

这种行为可以减少实际的操作次数。
例如:
In preceding example, Strings vaibhav and amit did not go through 地图 and 过滤 operation as we already got result(findAny()) with String john.

一些中间操作,例如 已排序 are executed on the entire collection. As succeding operations might depend on the result of 已排序 operation.

原始流

除了常规流之外, 爪哇 8 还为int,long和double提供原始Stream。
原始流是:

  1. Int的IntStream
  2. 长流长
  3. DoubleStream双

所有原始流都与常规流类似,但有以下区别。

  • It supports few terminal aggregate functions such 和(), 平均(), etc.
  • 它接受专用功能接口,例如IntPredicate代替Predicate,IntConsumer代替Consumer。

这是IntStream的示例。

将Stream转换为IntStream

You may need to convert Stream to IntStream to perform terminal aggregate operations such as sum or average. You can use 地图ToInt(), 地图ToLong() or 地图ToDouble() method to convert Stream to primitive Streams.
Here is an example:

将IntStream转换为流

You may need to convert IntStream to Stream to use it as any other datatype. You can use 地图ToObj() convert primitive Streams to regular Stream.
Here is an example:

员工阶层

Consider a 雇员 类 which has two fields 名称, 年龄, listOfCities.

Here listOfCities denotes cities in which Employee has lived so far.

This 雇员 类 will be used in all succeeding examples.
Let’s create 员工名单 on which we are going to perform intermediate and terminal operations.

常见的中间操作

地图()

地图()操作 用于转换流<T> to Stream<R>. It produces one output result of type 'R' for each input value of type 'T'. It takes 功能 接口作为参数。
For example:
You have stream of list of employees and you need a list of employee names, you simply need to convert 流<Employee> to 流<String>.

流图
地图操作的逻辑表示

您也可以使用map,即使它产生相同类型的结果。
In case, you want employee name in uppercase, you can use another 地图() function to convert string to uppercase.

过滤()

Filter()操作 用于根据条件过滤流。 Filter竞彩篮球分析采用Predicate()接口,该接口返回布尔值。
Let’例如,您要向以名字开头的员工‘A’.
您可以编写以下功能代码来实现相同的目的。

流过滤器
过滤器操作的逻辑表示

[![StreamFilter]

已排序()

您可以使用 已排序() 对对象列表进行排序的竞彩篮球分析。不带参数的sorted竞彩篮球分析以自然顺序对列表进行排序。 sorted()竞彩篮球分析还接受比较器作为参数来支持自定义排序。

💡 你知道吗?

自然顺序意味着根据列表元素类型实现的可比接口对列表进行排序。
例如:
清单<Integer> 将根据Integer类实现的可比较接口进行排序。

这是sorted()竞彩篮球分析的示例

Here is the 已排序() method example with 比较器 as a parameter.

您也可以使用 竞彩篮球分析参考 as below:

限制()

您可以使用limit()限制流中元素的数量。
For example:
限制(3) 返回列表中的前3个元素。

让’借助示例查看:

跳跃()

跳跃(int n) 竞彩篮球分析用于丢弃流中的前n个元素。
For example:
跳跃(3) 从流中丢弃前3个元素。

让’借助示例查看:

flatmap()

地图() 运算为每个输入元素生成一个输出。

如果每个输入都需要多个输出怎么办?
flatmap()操作 正是用于此目的。它用于为每个输入映射多个输出。
例如:
我们要累积所有员工居住的城市清单。一名员工可能居住在多个城市,因此每个员工可能拥有一个以上的城市。

让’借助示例查看:

常用终端操作

前言

前言() 是终端操作,用于迭代对象的收集/流。它需要 消费者 as a parameter.

让’s说您要打印流中的元素。

收藏

收藏() 是终端操作,使用收集器对Stream的元素执行可变还原。 收藏家 是提供内置收集器的实用程序类。
例如:
收藏家.toList() 提供了一个收集器,该收集器将Stream转换为列表对象。
以下代码将员工姓名累积到 数组列表

减少

归约运算结合了Stream的所有元素并产生单个结果。
爪哇 8有3个重载版本的reduce竞彩篮球分析。

  1. 可选的&lt;T&gt; reduce(BinaryOperator&lt;T&gt; accumulator):
    This method takes BinaryOperator accumulator function. BinaryOperator is BiFunction where both the operands are of same type. First parameter is result till current execution, and second parameter is the current element of the Stream.

    让’查找年龄最小的人的名字。

  2. T reduce(T identity, BinaryOperator<T> accumulator):
    此竞彩篮球分析具有标识值和累加器功能。同一性值是减少量的初始值。如果Stream为空,则结果为identity。
    Let’查找所有年龄段的员工的总和

  3. &lt;U&gt; U reduce(U identity, BiFunction&lt;U,? super T,U&gt; accumulator, BinaryOperator&lt;U&gt; combiner):
    该竞彩篮球分析采用标识值和累加器功能以及组合器。合并器主要用于以下情况 并行流。合并器合并并行运行的子流的结果。

计数

计数()用于计算流中元素的数量。

allMatch()

allMatch() 当流中的所有元素都满足提供的条件时,返回true。

这是一种短路端子操作,因为一旦遇到任何不匹配的元素,操作就会立即停止。

nonMatch()

nonMatch() 当流中的所有元素都不满足提供的条件时,返回true。

这是一种短路端子操作,因为一旦遇到任何匹配的元素,操作就会停止。

anyMatch()

anyMatch() 当流中的任何元素满足提供的条件时,返回true。

这是一种短路端子操作,因为一旦遇到任何匹配的元素,操作就会停止。

分()

分(Comparator) 根据提供的比较器返回流中的最小元素。它返回一个包含实际值的对象。

最高()

最高(Comparator) 根据提供的比较器返回流中的最大元素。它返回一个包含实际值的对象。

并行流

You can create Parallel Stream using .parallel() method on object in java.
Here is an example:

这是一篇关于 爪哇 8并行流.

练习题

让’在Stream上练习一些练习。

练习1

练习2

给定雇员列表,找到年龄大于25岁的雇员人数?
回答:

练习3

Given the list of employees, find the employee whose name is John.

练习4

给定雇员列表,您需要找到雇员的最高年龄吗?
回答:

练习5

给定雇员列表,您需要按年龄对雇员列表进行排序?仅使用Java 8 API
回答:

练习6

给定雇员列表,您需要将所有雇员姓名与","?
回答:

练习7

根据员工列表,您需要按姓名分组

相关文章

  • 在Java中将日期转换为LocalDate
    1月12日

    爪哇日期到LocalDate

    在这篇文章中,我们将看到如何在Java中将Date转换为LocalDate。有时,我们可能需要将Date转换为新的Java 8 API,反之亦然。在Java中,有多种将Date转换为LocalDate的竞彩篮球分析。另请参见:使用Date类的[InInstant()竞彩篮球分析将Java中的LocalDate转换为Date…]

  • 在Java中将LocalDate转换为Date
    1月11日

    迄今为止的Java LocalDate

    在这篇文章中,我们将看到如何将LocalDate转换为Date。 Java 8引入了许多有关日期和时间的新API。有多种竞彩篮球分析可以将Java LocalDateTime转换为日期。使用Instant对象您可以使用来自Zone的Instant对象将LocalDate转换为Date。这是 […]

  • 将流转换为Java中的列表
    12月31日

    爪哇流列表

    在本文中,我们将看到如何在Java中将Stream转换为List。在Java中,有多种竞彩篮球分析可以将Stream转换为List。使用Collectors.toList()可以将Collectors.toList()传递给Stream.collect()竞彩篮球分析,以在Java中将Stream转换为List。流’的collect竞彩篮球分析对Stream和Collectors的元素执行可变的约简操作。toList()提供[…]

  • 在Java中将LocalDateTime转换为时间戳
    11月18日

    在Java中将LocalDateTime转换为时间戳

    在本文中,我们将如何将LocalDateTime转换为Timestamp。在学习如何将localdatetime转换为时间戳之前,让我们了解LocalDateTime和Timestamp,并了解这种转换的重要性。 LocalDateTime LocalDateTime在Java 8中已引入。LocalDateTime可以导入时间包:import java.time.LocalDateTime; LocalDateTime是使用的不可变对象[…]

  • 要映射的Java流列表
    4月26日

    要映射的Java流列表

    在本文中,我们将看到如何在Java 8中使用Stream将List转换为Map。’s toMap()可与Stream一起使用,以在Java中将List转换为Map。考虑一个名为Movie的类,它具有3个字段–ID,名称和流派[crayon-6024c776af0db818210791 /]创建电影列表并将其转换为[…]

  • 爪哇流排序
    4月26日

    爪哇 Stream排序示例

    在本文中,我们将看到如何使用Stream.sorted()竞彩篮球分析对列表进行排序。 Java 8引入了Stream.sort()竞彩篮球分析来方便地对元素列表进行排序。它有助于我们编写简短的功能样式代码,而不是样板代码。 java.util.Stream具有sorted()竞彩篮球分析的两个重载版本。 sorted():返回包含元素[…]

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

订阅我们的新闻

获取质量教程到您的收件箱。现在订阅。