1. 概述
在Java中,集合是一组没有重复项的元素。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
。在这里,我们通过在尝试获取下一个项目之前先调用Iterator
的hasNext()
方法来防止这种情况。如果我们只需要获取并仅获取第一个元素,我们可以在使用Iterator
之前检查Set
是否为空。
3. 使用流(Streams)
从Set
中获取第一个元素的另一种选择是使用流(Streams)。我们可以使用stream()
方法将Set
转换为流。接着,我们可以使用流的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
中获取值时,会抛出NoSuchElementException
。为了防止这种情况,我们在尝试获取值之前先使用Optional
的ifPresent()
方法。
像这样使用流提供了更多对从Set
中获取的元素进行后处理的可能性。 例如,我们可以立即在findFirst()
后链接ifPresent()
并传入一个Consumer
来处理该项目。我们还可以使用流的sorted()
方法重新定义顺序,从而改变首先查看的元素。
4. 总结
在这篇文章中,我们了解了两种从Set
(特别是有序的LinkedHashSet
实现)中获取第一个元素的方法。使用Iterator
提供了一种简单的方法来检索第一个元素,并且如果需要,我们可以遍历所有项目。使用流提供了相同的功能,但为立即处理获取到的元素提供了更多的可能性,并允许我们控制查看项目时的顺序。
如往常一样,示例代码的完整版本可在GitHub上找到。