如果我有一个集合,例如Collection<String> strs
,我怎样才能获得第一个项目?我可以拨打Iterator
,先取next()
,然后再扔Iterator
。有没有浪费的方法吗?
答案 0 :(得分:385)
看起来这是最好的方法:
String first = strs.iterator().next();
很棒的问题......首先,它似乎是对Collection
界面的疏忽。
请注意,“first”并不总是返回您放入集合中的第一件事,并且可能仅对有序集合有意义。也许这就是没有get(item)
电话的原因,因为订单不一定会被保留。
虽然看起来有点浪费,但可能没有您想象的那么糟糕。 Iterator
实际上只包含集合中的索引信息,而不是通常是整个集合的副本。调用此方法会实例化Iterator
对象,但这确实是唯一的开销(而不是复制所有元素)。
例如,查看ArrayList<String>.iterator()
方法返回的类型,我们发现它是ArrayList::Itr
。这是一个内部类,它只是直接访问列表的元素,而不是复制它们。
请确保检查iterator()
的返回,因为它可能为空或null
,具体取决于实施方式。
答案 1 :(得分:118)
Iterables.get(yourC, indexYouWant)
因为实际上,如果您使用的是收藏集,则应该使用Google收藏夹。
答案 2 :(得分:74)
在java 8中:
Optional<String> firstElement = collection.stream().findFirst();
对于旧版本的java,在Guava Iterables中有一个getFirst方法:
Iterables.getFirst(iterable, defaultValue)
答案 3 :(得分:38)
Collection
中没有“第一”项目,因为它只是一个集合。
来自Java doc的Collection.iterator()方法:
无法保证元素的返回顺序......
所以你不能。
如果您使用其他界面,例如列表,则可以执行以下操作:
String first = strs.get(0);
但直接来自Collection,这是不可能的。
答案 4 :(得分:4)
听起来你的收藏品想要像列表一样,所以我建议:
List<String> myList = new ArrayList<String>();
...
String first = myList.get(0);
答案 5 :(得分:2)
在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);
}
答案 6 :(得分:1)
你可以进行投射。例如,如果存在一个具有此定义的方法,并且您知道此方法正在返回List:
Collection<String> getStrings();
在调用它之后,你需要第一个元素,你可以这样做:
List<String> listString = (List) getStrings();
String firstElement = (listString.isEmpty() ? null : listString.get(0));
答案 7 :(得分:1)
功能方式:
public static <T> Optional<T> findFirst(List<T> result) {
return Optional.ofNullable(result)
.map(List::stream)
.flatMap(Stream::findFirst);
}
从NullPointerException和IndexOutOfBoundsException保留的以上代码片段
答案 8 :(得分:0)
如果您知道该集合是一个队列,那么您可以将该集合强制转换为队列并轻松获取它。
您可以使用多种结构来获取订单,但是您需要投射它。
答案 9 :(得分:0)
这完全取决于您使用了哪种实现,无论是arraylist链表还是其他set的实现。
如果设置了那么你可以直接获取第一个元素,它们可以在集合上进行特技循环,创建一个值为1的变量,并在该循环中断后标志值为1时获取值。
如果它是列表的实现,则通过定义索引号很容易。
答案 10 :(得分:0)
Guava提供了bq=(color:silver AND brand:apple)^100
onlyElement
,但只有在您希望集合中只有一个元素时才使用它。
Collector
如果不确定有多少个元素,请使用Collection<String> stringCollection = ...;
String string = collection.stream().collect(MoreCollectors.onlyElement())
。
findFirst
答案 11 :(得分:-2)
你可以这样做:
String strz[] = strs.toArray(String[strs.size()]);
String theFirstOne = strz[0];
Collection的javadoc给出了数组元素的以下警告:
如果此集合对其迭代器返回的元素的顺序做出任何保证,则此方法必须以相同的顺序返回元素。