最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Java 8 Streams简介

网站源码admin4浏览0评论

Java 8 Streams简介

1. 概述

在本文中,我们将快速浏览Java 8添加的主要新功能之一 - Streams。

我们将解释什么是流,并通过简单的示例展示创建和基本流操作。

2. 流接口

Java 8 中的主要新功能之一是引入了流功能 - java.util.stream,其中包含用于处理元素序列的类。

中心 API 类是Stream<T>。以下部分将演示如何使用现有数据提供程序源创建流。

2.1. 流创建

流可以从不同的元素源创建,例如集合或数组,借助stream() 和of()方法:

代码语言:javascript代码运行次数:0运行复制
String[] arr = new String[]{"a", "b", "c"};
Stream<String> stream = Arrays.stream(arr);
stream = Stream.of("a", "b", "c");Copy

stream()default 方法被添加到集合接口中,并允许使用任何集合作为元素源来创建Stream<T>:

代码语言:javascript代码运行次数:0运行复制
Stream<String> stream = list.stream();
Copy

2.2. 流的多线程

Stream API 还通过提供parallelStream() 方法简化了多线程处理,该方法在并行模式下对流的元素运行操作。

下面的代码允许对流的每个元素并行运行方法doWork():

代码语言:javascript代码运行次数:0运行复制
list.parallelStream().forEach(element -> doWork(element));Copy

在下一节中,我们将介绍一些基本的流 API 操作。

3. 流操作

可以对流执行许多有用的操作。

它们分为中间操作(返回Stream<T>)和终端操作(返回确定类型的结果)。中间操作允许链接。

还值得注意的是,对流的操作不会更改源。

下面是一个快速示例:

代码语言:javascript代码运行次数:0运行复制
long count = list.stream().distinct().count();Copy

因此,distinct() 方法表示一个中间操作,它创建前一个流的唯一元素的新流。而 count() 方法是一个终端操作它返回流的大小。

3.1. 迭代

流 API 有助于替换、替换每个while循环。它允许专注于操作的逻辑,但不能专注于元素序列的迭代。例如:

代码语言:javascript代码运行次数:0运行复制
for (String string : list) {
    if (string.contains("a")) {
        return true;
    }
}Copy

只需一行 Java 8 代码即可更改此代码:

代码语言:javascript代码运行次数:0运行复制
boolean isExist = list.stream().anyMatch(element -> element.contains("a"));Copy

3.2. 过滤

filter() 方法允许我们选择满足谓词的元素流。

例如,请考虑以下列表:

代码语言:javascript代码运行次数:0运行复制
ArrayList<String> list = new ArrayList<>();
list.add("One");
list.add("OneAndOnly");
list.add("Derek");
list.add("Change");
list.add("factory");
list.add("justBefore");
list.add("Italy");
list.add("Italy");
list.add("Thursday");
list.add("");
list.add("");Copy

下面的代码创建一个 List<String>的List<String>,查找此流中包含字符“d”的所有元素,并创建一个仅包含筛选元素的新流:

代码语言:javascript代码运行次数:0运行复制
Stream<String> stream = list.stream().filter(element -> element.contains("d"));Copy

3.3. 映射

要通过对 Stream 的元素应用特殊函数来转换它们并将这些新元素收集到Stream 中,我们可以使用map() 方法:

代码语言:javascript代码运行次数:0运行复制
List<String> uris = new ArrayList<>();
uris.add("C:\\My.txt");
Stream<Path> stream = uris.stream().map(uri -> Paths.get(uri));Copy

因此,上面的代码通过将特定的 lambda 表达式应用于初始 Stream 的每个元素,将 Stream<String>转换为Stream<Path>

如果你有一个流,其中每个元素都包含自己的元素序列,并且你想要创建这些内部元素的流,你应该使用flatMap() 方法:

代码语言:javascript代码运行次数:0运行复制
List<Detail> details = new ArrayList<>();
details.add(new Detail());
Stream<String> stream
  = details.stream().flatMap(detail -> detail.getParts().stream());Copy

在此示例中,我们有一个类型为Detail 的元素列表。Detail类包含一个字段PARTS,它是一个List<String>。在flatMap() 方法的帮助下,字段PARTS中的每个元素都将被提取并添加到新的结果流中。之后,初始Stream<Detail> 将丢失

3.4. 匹配

流 API 提供了一组方便的工具,用于根据某些谓词验证序列的元素。为此,可以使用以下方法之一:anyMatch(),allMatch(),noneMatch()。他们的名字是不言自明的。这些是返回布尔值的终端操作:

代码语言:javascript代码运行次数:0运行复制
boolean isValid = list.stream().anyMatch(element -> element.contains("h")); // true
boolean isValidOne = list.stream().allMatch(element -> element.contains("h")); // false
boolean isValidTwo = list.stream().noneMatch(element -> element.contains("h")); // falseCopy

对于空流,具有任何给定谓词的allMatch() 方法将返回true

代码语言:javascript代码运行次数:0运行复制
Stream.empty().allMatch(Objects::nonNull); // trueCopy

这是一个明智的默认值,因为我们找不到任何不满足谓词的元素。

类似地,anyMatch() 方法对于空流总是返回false

代码语言:javascript代码运行次数:0运行复制
Stream.empty().anyMatch(Objects::nonNull); // falseCopy

同样,这是合理的,因为我们找不到满足此条件的元素。

3.5. 减少

Stream API 允许在Stream 类型的reduce() 方法的帮助下,根据指定的函数将元素序列减少到某个值。此方法采用两个参数:第一个 – 起始值,第二个 – 累加器函数。

假设你有一个List<Integer>并且你想要所有这些元素和一些初始整数的总和(在本例中为23)。因此,您可以运行以下代码,结果将是 26 (23 + 1 + 1 + 1)。

代码语言:javascript代码运行次数:0运行复制
List<Integer> integers = Arrays.asList(1, 1, 1);
Integer reduced = integers.stream().reduce(23, (a, b) -> a + b);Copy

3.6. 收集

缩减也可以由 Stream 类型的collect() 方法提供在将流转换为集合映射并以单个字符串的形式表示流的情况下,此操作非常方便有一个实用程序类收集器,它为几乎所有典型的收集操作提供了解决方案。对于某些非微不足道的任务,可以创建自定义收集器

代码语言:javascript代码运行次数:0运行复制
List<String> resultList 
  = list.stream().map(element -> element.toUpperCase()).collect(Collectors.toList());Copy

此代码使用终端collect() 操作将Stream<String> 缩减为List<String>。

4. 结论

在本文中,我们简要介绍了 Java 流 — 绝对是最有趣的 Java 8 特性之一。

有许多使用流的更高级示例;本文的目的只是提供快速实用的介绍,说明您可以开始使用该功能做什么,并作为探索和进一步学习的起点。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2023-02-16,如有侵权请联系 cloudcommunity@tencent 删除javastream函数集合终端

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论