返回介绍

8.9 操作集合

发布于 2025-04-22 20:10:01 字数 3067 浏览 0 评论 0 收藏

EL 3.0 带来了很多新特性。 其中一个主要的贡献是操纵集合的能力。你可以通过调用流方法将集合转换为流来使用此功能。

下面展示如何将列表转换为流,假设 myList 是一个 java.util.List:

${myList.stream()}

大部分流的操作会返回另一个流,因而可以形成链式操作。

$ {MyList.stream().operation-1().operation-2().toList()}

在链式操作的末尾,通常调用 toList 方法,以便打印或格式化结果。

以下小节介绍了你可以对流执行的一些操作

8.9.1 toList

toList 方法返回一个 List,它包含与当前流相同的成员。调用此方法的主要目的是轻松地打印或操作流元素。下面是一个将列表转换为流并返回列表的示例:

$ {[100, 200, 300].stream().toList()}

当然这个例子没有什么用。稍后在接下来的小节中,你将看到更多的例子。

8.9.2 toArray

与 toList 类似,但返回一个 Java 数组。同样,在数组中呈现元素通常是有用的,因为许多 Java 方法将数组作为参数。这里是一个 toArray 的例子:

$ {["One","Two","Three"].stream().toArray()}

与 toList 不同,toArray 不打印元素。因此,toList 更经常使用。

8.9.3 limit

limit 方法限制流中元素的数量。

名为 cities 的 List 包含 7 个城市:

[Paris, Strasbourg, London, New York, Beijing, Amsterdam, San Francisco]

下面的代码将元素的数量限制为 3。

$ {cities.stream().limit(3).toList()}

执行时,表达式将返回此列表:

[Paris, Strasbourg, London]

如果传递给 limit 方法的参数大于元素的数量,则返回所有元素。

8.9.4 sort

此方法对流中的元素进行排序。例如,这个表达式

$ {cities.stream().sorted().toList()}

返回如下排序后的列表。

[Amsterdam, Beijing, London, New York, Paris, San Francisco, Strasbourg]

8.9.5 average

此方法返回流中所有元素的平均值。其返回值是一个 Optional 对象,它可能为 null。需要调用 get() 获取实际值。

此表达式返回 4.0:

$ {[1,3,5,7].stream().average().get()}

8.9.6 sum

此方法计算流中所有元素的总和。例如,此表达式返回 16。

$ {[1,3,5,7].stream().sum()}

8.9.7 count

此方法返回流中元素的数量。例如,此表达式返回 7。

$ {cities.stream().count()}

8.9.8 min

此方法返回流的元素中的最小值。同 average 方法一样,其返回值是一个 Optional 对象,因此你需要调用 get 方法来获取实际值。例如,此表达式返回 1。

$ {[1,3,100,1000].stream().min().get()}

8.9.9 max

此方法返回流的元素中的最大值。同 average 方法一样,其返回值是一个 Optional 对象,因此你需要调用 get 方法来获取实际值。例如,此表达式返回 1000。

$ {[1,3,100,1000].stream().max().get()}

8.9.10 map

此方法将流中的每个元素映射到另一个流中的另一个元素,并返回该流。此方法接受一个 lambda 表达式。

例如,此映射方法使用 lambda 表达式 x - > 2 * x,这实际上将每个元素乘 2,并将它们返回到新的流中。

$ {[1,3,5].stream().map(x - > 2 * x).toList()}

返回列表如下:

[2,6,10]

下面是另一个示例,它将字符映射为大写。

$ {cities.stream().map(x - > x.toUpperCase()).toList()}

它返回以下列表。

[PARIS,STRASBOURG,LONDON,NEW YORK,BEIJING,AMSTERDAM,SAN FRANCISCO]

8.9.11 filter

此方法根据 lambda 表达式过滤流中的所有元素,并返回包含结果的新流。

例如,以下表达式测试城市是否以“S”开头,并返回所有的结果。

$ {cities.stream().filter(x - > x.startsWith("S")).toList()}

它产生的列表如下所示:

[Strasbourg, San Francisco]

8.9.12 forEach

此方法对流中的所有元素执行操作。它返回 void。 例如,此表达式将城市中的所有元素打印到控制台。

$ {cities.stream().forEach(x - > System.out.println(x))}

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。