如何从Java Set中获取第一个元素
如何从Java Set中获取第一个元素
1. 概述
Set 是一个不允许重复项的集合。Java 提供了 Set 接口以及几个该接口的实现供我们使用。本教程将探讨如何从 Set 中获取第一个元素。Java Set 按定义是无序的,但有些实现确实保持了顺序,例如 LinkedHashSet,我们将在这里重点讨论。
2. 使用 Iterator
我们可以使用 Iterator 来检索 Set 中的第一个元素。 Set 接口允许我们使用 iterator() 方法为所有实现获取 Iterator。然后我们可以调用 Iterator 上的 next() 来获取第一个项目:
@Test
void givenASet_whenUsingIterator_thenRetrieveAnItem() {
Set```<Integer>``` set = new LinkedHashSet<>(Arrays.asList(1, 2, 3, 4, 5));
Iterator iterator = set.iterator();
if (iterator.hasNext()) {
int retrieved = (int) iterator.next();
assertEquals(retrieved, 1);
}
}
我们这里实例化了一个填充了五个 Integer 的 LinkedHashSet。我们最后的断言显示我们已成功从 Set 中检索到第一个元素。
如果我们的 Set 是空的,或者我们的 Iterator 中没有更多元素,next() 将抛出 NoSuchElementException。我们在这里通过使用 Iterators 的 hasNext() 方法来防止这种情况,尝试获取下一个项目之前。如果我们的使用情况仅仅是获取第一个且仅有第一个项目,我们可以在不使用 Iterator 之前检查 Set 是否为空。
3. 使用 Streams
从 Set 中获取第一个项目的第二个选项是使用 Streams。我们可以使用 stream() 方法将 Set 转换为 Stream。然后,我们可以使用 Streams 的 findFirst() 方法,它将返回一个 Optional。最后,我们在 Optional 上调用 get() 来检索我们的项目:
@Test
void givenASet_whenUsingStreams_thenRetrieveAnItem() {
Set```<Integer>``` set = new LinkedHashSet<>(Arrays.asList(1, 2, 3, 4, 5));
Optional```<Integer>``` optional = set.stream().findFirst();
if (optional.isPresent()) {
int retrieved = optional.get();
assertEquals(retrieved, 1);
}
}
这段代码和我们之前看到的一样,如果 Set 中没有项目,我们在调用 Optional 上的 get() 时会得到 NoSuchElementException。为了防止这种情况,我们在尝试检索值之前使用了 Optional 上的 ifPresent()。
使用 Streams 像这样为我们打开了更多对从 Set 中检索的项目进行后处理的选项。 例如,我们可以立即将 ifPresent() 链接到 findFirst() 并传递一个 Consumer 来处理项目。我们也可以使用 Streams 的 sorted() 方法重新定义顺序,因此第一个项目将是什么。
4. 结论
在本文中,我们看到了两种从 Set 中获取第一个项目的方法,特别是 LinkedHashSet 实现,因为它是有序的。使用 Iterator 提供了一种简单的方式来检索第一个项目,如果需要,我们可以循环遍历所有目。使用 Streams 提供了相同的功能,但为我们提供了更多直接使用检索到的项目并允许我们控制查看项目顺序的选项。
如常,示例的完整代码可在 GitHub 上找到。