Java Stream API(中篇)

「这是我参与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()方法以Collectorjava.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,然后获取该ListStream,为其添加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表达式返回的值(如果有)。您可以通过调用Optionalget()方法来获取该值。

toArray()

Java Stream toArray()方法是一个终端操作,它启动流中元素的内部迭代,并返回包含所有元素的Object数组。下面是一个Java Stream toArray()示例:

猜你喜欢

转载自juejin.im/post/7031746362702200846