Java:从集合中获取第一项

如果我有一个集合,比如Collection<String> strs ,我怎样才能得到第一个项目呢? 我可以调用一个Iteratornext()的第next() ,然后抛出Iterator 。 有没有更浪费的方式来做到这一点?

Iterables.get(yourC,indexYouWant)

因为如果您使用的是Collections,那么您应该使用Google Collections。

看起来这是最好的方法:

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

伟大的问题…起初,这似乎是一个疏忽Collection界面。

请注意,“第一个”不会总是返回您放入集合中的第一件东西,并且可能只对有序集合有意义。 也许这就是为什么没有一个get(item)调用,因为订单不一定被保存。

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

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

在java 8中:

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

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

 Iterables.getFirst(iterable, defaultValue) 

在“ Collection ”中没有“第一个”这样的东西,因为它只是一个集合。

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

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

所以你不能。

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

 String first = strs.get(0); 

但直接从收集这是不可能的。

这听起来像你的集合想成为列表,所以我build议:

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

在Java 8中,您可以使用许多运算符,例如限制

  /** * 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); } 

你可以做一个铸造。 例如,如果存在一个具有此定义的方法,并且您知道此方法正在返回一个List:

 Collection<String> getStrings(); 

在调用它之后,你需要第一个元素,你可以这样做:

 List<String> listString = (List) getStrings(); String firstElement = (listString.isEmpty() ? null : listString.get(0)); 

如果您知道该集合是一个队列,那么您可以将该集合转换为队列并轻松获取。

您可以使用几种结构来获得订单,但是您需要投入。

它完全取决于你使用的是哪种实现,无论是数组列表链表,还是其他的实现。

如果它被设置,那么你可以直接得到第一个元素,它们可以在集合上进行技巧循环,创build一个值为1的variables,并在标志值为1之后得到值,然后中断该循环。

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

你可以这样做:

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

Collection的javadoc提供了以下关于数组元素sorting的注意事项:

如果这个集合保证了它的迭代器返回的元素的顺序,这个方法必须以相同的顺序返回元素。