「这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战」
终端操作
Java Stream
接口的终端操作通常返回单个值。一旦在Stream
上调用终端操作,将开始Stream
和任何链流的迭代。迭代完成后,终端操作的结果将返回。
终端操作通常不会返回新的Stream
实例。因此,一旦您在流上调用终端操作,从非终端操作链接Stream
实例将结束。以下是在Java Stream
上调用终端操作的示例:
long count = stream
.map((value) -> { return value.toLowerCase(); })
.map((value) -> { return value.toUpperCase(); })
.map((value) -> { return value.substring(0,3); })
.count();
复制代码
示例末尾对count()
的调用是终端操作。由于count()
返回一个long
,非终端操作的Stream
链(map()
调用)将终止。
anyMatch()
Java Stream anyMatch()方法是一个终端操作,它以singlePredicate为参数,开始流的内部迭代,并将Predicate参数应用于每个元素。如果Predicate对任何元素返回true, anyMatch()方法返回true。如果没有元素匹配谓词,anyMatch()将返回false。下面是一个Java Stream anyMatch()示例:
在上面的示例中,anyMatch()
方法调用将返回true
,因为流中的第一个字符串元素以“One”开头。
allMatch()
Java Stream allMatch()方法是一个终端操作,它接受singlePredicate作为参数,开始流中元素的内部迭代,并将Predicate参数应用于每个元素。如果Predicate为流中的所有元素返回true,那么allMatch()将返回true。如果不是所有元素都匹配Predicate, allMatch()方法将返回false。这是一个Java流' ' allMatch()的例子:
在上面的示例中,allMatch()
方法将返回false
,因为Stream
中只有一个字符串以“One”开头。
noneMatch()
Java Stream noneMatch()方法是一个终端操作,它将迭代流中的元素并返回true或false,这取决于流中是否没有元素与传递给noneMatch()的谓词相匹配。如果Predicate没有匹配元素,则noneMatch()方法将返回true,如果匹配一个或多个元素,则返回false。下面是一个Java Stream noneMatch()示例:
collect()
Java Stream collect()方法是一个终端操作,它开始元素的内部迭代,并以某种类型的集合或对象收集流中的元素。下面是一个简单的Java Stream collect()方法示例:
collect()
方法以Collector
(java.util.stream.Collector
)为参数。实现Collector
需要对Collector
界面进行一些研究。幸运的是,Java类java.util.stream.Collectors
包含一组可用于最常见的操作的预实现Collector
实现。在上面的示例中,使用的是Collectors.toList()
返回的Collector实现。此Collector
只需在标准Java中收集流中的所有元素List
count()
Java Stream count()方法是一个终端操作,它开始对Stream中的元素进行内部迭代,并对元素进行计数。下面是一个Java流' ' count()示例:
此示例首先创建一个字符串List
,然后获取该List
的Stream
,为其添加aflatMapflatMap()
操作,然后以count()
的调用结束。count()
方法将开始Stream
中元素的迭代,这将导致字符串元素在flatMap()
操作中分解为单词,然后计数。最终打印出来的结果是14。
findAny()
Java Stream findAny()方法可以从流中找到单个元素。找到的元素可以来自流中的任何地方。不能保证从流中的什么位置获取元素。下面是一个Java Stream findAny()示例:
注意findAny()方法如何返回一个Optional。流可以是空的——因此不能返回任何元素。你可以通过可选的isPresent()方法检查是否找到了一个元素。
findFirst()
如果流中存在任何元素,则Java Stream findFirst()方法查找流中的第一个元素。findFirst()方法返回一个optional,您可以从中获取元素(如果存在的话)。下面是一个Java Stream findFirst()示例:\
您可以通过isPresent()
方法检查返回的Optional
是否包含元素。
forEach()
Java Stream forEach()方法是一个终端操作,它开始流中元素的内部迭代,并对流中的每个元素应用一个Consumer(Java .util.function.Consumer)。forEach()方法返回void。下面是一个Java Stream forEach()示例:
min()
Java Stream min()方法是一个终端操作,返回流中最小的元素。哪个元素最小是由传递给min()方法的Comparatorimplementation决定的。我已经在关于Java集合排序的教程中解释了Comparatorinterface是如何工作的。下面是一个Java流' ' min()的例子:
注意min()方法如何返回一个Optional,它可能包含也可能不包含结果。如果Stream为空,可选get()方法将抛出NoSuchElementException。
max()
Java Stream max()方法是一个终端操作,它返回流中最大的元素。哪个元素最大由传递给max()方法的Comparatorimplementation决定。我已经在关于Java集合排序的教程中解释了Comparatorinterface是如何工作的。这是一个Java流' ' max()的例子:
注意max()方法如何返回一个Optional,它可能包含也可能不包含结果。如果Stream为空,可选get()方法将抛出NoSuchElementException。
reduce()
Java Stream reduce()方法是一个终端操作,可以将流中的所有元素减少为单个元素。下面是一个Java Stream reduce()示例:
注意reduce()
方法返回的Optional
。此Optional
包含传递给reduce()
方法的lambda表达式返回的值(如果有)。您可以通过调用Optional
的get()
方法来获取该值。
toArray()
Java Stream toArray()方法是一个终端操作,它启动流中元素的内部迭代,并返回包含所有元素的Object数组。下面是一个Java Stream toArray()示例: