Java:从集合中获取第一个项目

时间:2009-11-04 02:22:52

标签: java collections iterable

如果我有一个集合,例如Collection<String> strs,我怎样才能获得第一个项目?我可以拨打Iterator,先取next(),然后再扔Iterator。有没有浪费的方法吗?

12 个答案:

答案 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给出了数组元素的以下警告:

  

如果此集合对其迭代器返回的元素的顺序做出任何保证,则此方法必须以相同的顺序返回元素。