如果我有一个集合,如集合<String> strs,我怎么能得到第一项?我可以调用一个迭代器,取它的第一个next(),然后丢弃迭代器。有没有更少浪费的方法呢?


当前回答

Guava提供了一个onlyElement Collector,但只有在希望集合只有一个元素时才使用它。

Collection<String> stringCollection = ...;
String string = collection.stream().collect(MoreCollectors.onlyElement())

如果不确定有多少元素,请使用findFirst。

Optional<String> optionalString = collection.stream().findFirst();

其他回答

功能:

public static <T> Optional<T> findFirst(List<T> result) {
    return Optional.ofNullable(result)
            .map(List::stream)
            .flatMap(Stream::findFirst);
}

上面的代码片段保留NullPointerException和IndexOutOfBoundsException

这完全取决于你使用的是哪种实现,是arraylist linkedlist,还是set的其他实现。

如果它被设置了,那么你可以直接获得第一个元素,它们可以在集合上进行诡计循环,创建一个值为1的变量,当标志值为1时获得值,然后打破循环。

如果是列表的实现,那么通过定义索引号很容易。

你可以这样做:

String strz[] = strs.toArray(String[strs.size()]);
String theFirstOne = strz[0];

javadoc for Collection给出了如下数组元素的顺序:

如果该集合对其迭代器返回元素的顺序有任何保证,则该方法必须以相同的顺序返回元素。

在Java 8中,你有很多操作符可以使用,比如limit

     /**
 * Operator that limit the total number of items emitted through the pipeline
 * Shall print
 * [1]
 * @throws InterruptedException
 */
@Test
public void limitStream() throws InterruptedException {
    List<Integer> list = Arrays.asList(1, 2, 3, 1, 4, 2, 3)
                               .stream()
                               .limit(1)
                               .collect(toList());
    System.out.println(list);
}

没有这样的东西作为“第一”项目在一个集合,因为它是…嗯,只是一个集合。

从Java文档的Collection.iterator()方法:

没有关于元素返回顺序的保证。

所以你不能。

如果使用其他接口,如List,可以执行以下操作:

String first = strs.get(0);

但直接从一个集合这是不可能的。