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

问题描述 投票:242回答:11

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

java collections iterable
11个回答
124
投票

Iterables.get(yourC, indexYouWant)

因为,如果您正在使用收藏集,那么您应该使用Google收藏集。


0
投票

它完全取决于您使用的实现,无论是arraylist链表还是其他set实现。

如果设置了那么你可以直接获取第一个元素,它们可以在集合上进行特技循环,创建一个值为1的变量,并在该循环之后标记值为1时获取值。

如果它是list的实现,那么通过定义索引号很容易。


-2
投票

你可以这样做:

String strz[] = strs.toArray(String[strs.size()]);
String theFirstOne = strz[0];

Collection的javadoc给出了数组元素的以下警告:

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


393
投票

看起来这是最好的方法:

String first = strs.iterator().next();

很好的问题......起初,它似乎是对Collection界面的疏忽。

请注意,“first”并不总是返回您放入集合中的第一件事,并且可能仅对有序集合有意义。也许这就是为什么没有get(item)电话,因为订单不一定保留。

虽然看起来有点浪费,但可能没有您想象的那么糟糕。 Iterator实际上只包含索引信息到集合中,而不是通常是整个集合的副本。调用此方法会实例化Iterator对象,但这确实是唯一的开销(而不是复制所有元素)。

例如,查看ArrayList<String>.iterator()方法返回的类型,我们看到它是ArrayList::Itr。这是一个内部类,它只是直接访问列表的元素,而不是复制它们。

请确保你检查iterator()的返回,因为它可能是空的或null取决于实现。


76
投票

在java 8中:

Optional<String> firstElement = collection.stream().findFirst();

对于旧版本的java,在Guava Iterables中有一个getFirst方法:

Iterables.getFirst(iterable, defaultValue)

38
投票

Collection中没有“第一”这样的东西,因为它只是一个集合。

从Java doc的Collection.iterator()方法:

对于元素返回的顺序没有任何保证......

所以你不能。

如果使用其他界面(如List),则可以执行以下操作:

String first = strs.get(0);

但直接来自Collection,这是不可能的。


4
投票

听起来你的收藏品想要像列表一样,所以我建议:

List<String> myList = new ArrayList<String>();
...
String first = myList.get(0);

2
投票

在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);
}

1
投票

你可以做一个演员。例如,如果存在一个具有此定义的方法,并且您知道此方法返回List:

Collection<String> getStrings();

在调用它之后,你需要第一个元素,你可以这样做:

List<String> listString = (List) getStrings();
String firstElement = (listString.isEmpty() ? null : listString.get(0));

1
投票

Guava提供了onlyElement Collector,但只有在您希望该系列只有一个元素时才使用它。

Collection<String> stringCollection = ...;
String string = collection.stream().collect(MoreCollectors.onlyElement())

如果您不确定有多少元素,请使用findFirst

Optional<String> optionalString = collection.stream().findFirst();

0
投票

如果您知道该集合是一个队列,那么您可以将该集合转换为队列并轻松获取它。

您可以使用几种结构来获取订单,但您需要投射到它。

© www.soinside.com 2019 - 2024. All rights reserved.