Java:从集合中获取第一项
如果我有一个集合,比如Collection<String> strs
,我怎样才能得到第一个项目呢? 我可以调用一个Iterator
, next()
的第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的注意事项:
如果这个集合保证了它的迭代器返回的元素的顺序,这个方法必须以相同的顺序返回元素。