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


当前回答

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

其他回答

Iterables。get (indexYouWant yourC)

因为实际上,如果你使用集合,你应该使用谷歌集合。

在java 8中:

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

对于旧版本的java,在Guava Iterables中有一个getFirst方法:

Iterables.getFirst(iterable, defaultValue)

听起来你的Collection想要像list一样,所以我建议:

List<String> myList = new ArrayList<String>();
...
String first = myList.get(0);

如果知道集合是队列,则可以将集合强制转换为队列并轻松获取它。

您可以使用几个结构来获得订单,但需要对其进行强制转换。

看起来这是最好的方法:

String first = strs.iterator().next();

好问题……起初,这似乎是Collection接口的一个疏忽。

请注意,“first”并不总是返回您放入集合中的第一个东西,并且可能只对有序集合有意义。也许这就是没有get(item)调用的原因,因为不一定要保留顺序。

虽然这看起来有点浪费,但可能没有你想的那么糟糕。Iterator实际上只是将索引信息包含到集合中,通常不是整个集合的副本。调用此方法确实实例化了Iterator对象,但这实际上是唯一的开销(不像复制所有元素)。

例如,查看ArrayList<String>.iterator()方法返回的类型,我们看到它是ArrayList::Itr。这是一个内部类,它直接访问列表中的元素,而不是复制它们。

只是要确保检查iterator()的返回值,因为它可能是空的或空的,这取决于实现。