如果我有一个收藏,例如Collection<String> strs
,我如何拿出第一件?我可以先叫一个Iterator
,先取一个next()
,然后扔掉Iterator
。有没有更浪费的方法呢?
如果我有一个收藏,例如Collection<String> strs
,我如何拿出第一件?我可以先叫一个Iterator
,先取一个next()
,然后扔掉Iterator
。有没有更浪费的方法呢?
Answers:
Iterables.get(yourC,indexYouWant)
因为实际上,如果您使用的是收藏夹,则应该使用Google收藏夹。
看起来这是最好的方法:
String first = strs.iterator().next();
很好的问题...起初,它似乎是对Collection
接口的疏忽。
请注意,“ first”并不总是返回您放入集合中的第一件事,并且仅对有序集合有意义。也许这就是为什么没有get(item)
电话的原因,因为不一定要保留订单。
尽管这似乎有些浪费,但它可能没有您想像的那么糟糕。该Iterator
真的只是包含索引信息到集合,而不是通常的整个集合的副本。调用此方法确实会实例化该Iterator
对象,但这实际上是唯一的开销(与复制所有元素不同)。
例如,查看ArrayList<String>.iterator()
方法返回的类型,我们看到它是ArrayList::Itr
。这是一个内部类,仅直接访问列表的元素,而不是复制它们。
只需确保您检查的返回值即可,iterator()
因为它可能为空或null
取决于实现。
在Java 8中:
Optional<String> firstElement = collection.stream().findFirst();
对于较旧的Java版本,Guava Iterables中有一个getFirst方法:
Iterables.getFirst(iterable, defaultValue)
getFirst
可用的方法。有get
和getLast
方法
在其中没有“第一”项目,Collection
因为它只是一个集合。
通过Java文档的Collection.iterator()方法:
无法保证元素返回的顺序...
所以你不能。
如果您使用另一个接口(例如List),则可以执行以下操作:
String first = strs.get(0);
但是不可能直接从Collection中进行。
get(int n)
针对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);
}
您可以进行转换。例如,如果存在一个具有此定义的方法,并且您知道该方法正在返回List:
Collection<String> getStrings();
在调用它之后,您需要第一个元素,您可以像这样进行操作:
List<String> listString = (List) getStrings();
String firstElement = (listString.isEmpty() ? null : listString.get(0));
如果您知道集合是一个队列,则可以将集合强制转换为队列并轻松获取。
您可以使用几种结构来获取订单,但是您需要将其强制转换为订单。
功能方式:
public static <T> Optional<T> findFirst(List<T> result) {
return Optional.ofNullable(result)
.map(List::stream)
.flatMap(Stream::findFirst);
}
上面的代码段保留为NullPointerException和IndexOutOfBoundsException
List<T>
不满足它适用于的条件Collection<String>
,但当然可以使用进行固定,但需要进行Collection<T>
额外的更改:.map(Collection::stream)
。
您可以这样做:
String strz[] = strs.toArray(String[strs.size()]);
String theFirstOne = strz[0];
Collection的javadoc对数组元素给出以下警告:
如果此集合保证其迭代器返回其元素的顺序,则此方法必须以相同的顺序返回元素。