1. 概述

在Java中,集合是一组没有重复项的元素。Java提供了一个Set接口以及多种实现此接口的类供我们使用。本教程将介绍如何从Set中获取第一个元素。虽然Java的Set本质上是无序的,但有些实现如LinkedHashSet会维护顺序,这里我们将主要关注这个特性。

2. 使用Iterator

我们可以使用IteratorSet中获取第一个元素。 Set接口允许我们通过iterator()方法为所有实现获取一个Iterator。然后,我们可以调用Iteratornext()方法来获取第一个项目:

@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);
    }
}

这里我们创建了一个包含五个IntegerLinkedHashSet实例。最后的断言显示我们成功地从Set中获取了第一个元素。

如果Set为空,或者Iterator中没有更多元素,next()方法将抛出NoSuchElementException。在这里,我们通过在尝试获取下一个项目之前先调用IteratorhasNext()方法来防止这种情况。如果我们只需要获取并仅获取第一个元素,我们可以在使用Iterator之前检查Set是否为空。

3. 使用流(Streams)

Set中获取第一个元素的另一种选择是使用流(Streams)。我们可以使用stream()方法将Set转换为流。接着,我们可以使用流的findFirst()方法,它会返回一个Optional。最后,我们调用Optionalget()方法来获取我们的元素:

@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。为了防止这种情况,我们在尝试获取值之前先使用OptionalifPresent()方法。

像这样使用流提供了更多对从Set中获取的元素进行后处理的可能性。 例如,我们可以立即在findFirst()后链接ifPresent()并传入一个Consumer来处理该项目。我们还可以使用流的sorted()方法重新定义顺序,从而改变首先查看的元素。

4. 总结

在这篇文章中,我们了解了两种从Set(特别是有序的LinkedHashSet实现)中获取第一个元素的方法。使用Iterator提供了一种简单的方法来检索第一个元素,并且如果需要,我们可以遍历所有项目。使用流提供了相同的功能,但为立即处理获取到的元素提供了更多的可能性,并允许我们控制查看项目时的顺序。

如往常一样,示例代码的完整版本可在GitHub上找到。