Nic*_*ner 257 java collections iterable
如果我有一个收藏品,例如Collection<String> strs
,我怎样才能获得第一件商品?我可以打电话给Iterator
第一个next()
,然后扔掉它Iterator
.有没有浪费的方法吗?
jhe*_*ngs 410
看起来这是最好的方法:
String first = strs.iterator().next();
Run Code Online (Sandbox Code Playgroud)
很好的问题......起初,它似乎是对Collection
界面的疏忽.
请注意,"first"并不总是返回您放入集合中的第一件事,并且可能仅对有序集合有意义.也许这就是为什么没有get(item)
电话,因为订单不一定是坚持的.
虽然看起来有点浪费,但可能没有您想象的那么糟糕.该Iterator
真的只是包含索引信息到集合,而不是通常的整个集合的副本.调用此方法会实例化Iterator
对象,但这实际上是唯一的开销(而不是复制所有元素).
例如,查看ArrayList<String>.iterator()
方法返回的类型,我们看到它是ArrayList::Itr
.这是一个内部类,它只是直接访问列表的元素,而不是复制它们.
Car*_*arl 126
Iterables.get(yourC,indexYouWant)
因为,如果您正在使用收藏集,那么您应该使用Google收藏集.
Vit*_*nko 78
在java 8中:
Optional<String> firstElement = collection.stream().findFirst();
Run Code Online (Sandbox Code Playgroud)
对于旧版本的java,在Guava Iterables中有一个getFirst方法:
Iterables.getFirst(iterable, defaultValue)
Run Code Online (Sandbox Code Playgroud)
Osc*_*Ryz 38
a中没有"第一"这样的东西,Collection
因为它只是一个集合.
从Java doc的Collection.iterator()方法:
对于元素返回的顺序没有任何保证......
所以你不能.
如果使用其他界面(如List),则可以执行以下操作:
String first = strs.get(0);
Run Code Online (Sandbox Code Playgroud)
但直接来自Collection,这是不可能的.
听起来你的收藏想要像列表一样,所以我建议:
List<String> myList = new ArrayList<String>();
...
String first = myList.get(0);
Run Code Online (Sandbox Code Playgroud)