java:从集合中获取第一项

e0bqpujr  于 2021-06-30  发布在  Java
关注(0)|答案(12)|浏览(462)

如果我有收藏,比如 Collection<String> strs ,我怎样才能把第一件东西拿出来?我可以打个电话 Iterator ,第一个 next() ,然后抛出 Iterator 走开。有没有不那么浪费的方法?

vd8tlhqk

vd8tlhqk1#

如果您知道集合是一个队列,那么您可以将集合强制转换为一个队列并轻松获得它。
您可以使用几种结构来获取订单,但需要对其进行强制转换。

vjrehmav

vjrehmav2#

功能方式:

public static <T> Optional<T> findFirst(List<T> result) {
    return Optional.ofNullable(result)
            .map(List::stream)
            .flatMap(Stream::findFirst);
}

上面的代码段保留了nullpointerexception和indexoutofboundsexception

lc8prwob

lc8prwob3#

在java 8中:

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

对于旧版本的java,guava iterables中有一个getfirst方法:

Iterables.getFirst(iterable, defaultValue)
cedebl8k

cedebl8k4#

你可以这样做:

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

javadoc for collection针对数组元素的排序给出了以下警告:
如果此集合保证其迭代器返回元素的顺序,则此方法必须以相同的顺序返回元素。

i2byvkas

i2byvkas5#

看来这是最好的办法:

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

好问题。。。一开始,这似乎是对政府的疏忽 Collection 接口。
请注意,“first”并不总是返回您放入集合中的第一件东西,并且可能只对有序集合有意义。也许这就是为什么没有 get(item) 呼叫,因为顺序不一定保留。
虽然这看起来有点浪费,但可能没有你想象的那么糟糕。这个 Iterator 实际上,它只是将索引信息包含到集合中,而不是整个集合的副本。调用此方法不会示例化 Iterator 对象,但这实际上是唯一的开销(不像复制所有元素)。
例如,查看 ArrayList<String>.iterator() 方法,我们看到它是 ArrayList::Itr . 这是一个内部类,它只是直接访问列表中的元素,而不是复制它们。
一定要检查一下 iterator() 因为它可能是空的或者 null 取决于实施情况。

6qfn3psc

6qfn3psc6#

这完全取决于您使用了哪个实现,是arraylist linkedlist,还是set的其他实现。
如果设置了,那么您可以直接获取第一个元素,它们可以在集合上进行技巧循环,创建一个值为1的变量,并在标志值为1时获取值,然后中断该循环。
如果是list的实现,那么通过定义索引号就很容易了。

whitzsjs

whitzsjs7#

你可以选一个角色。例如,如果存在一个具有此定义的方法,并且您知道此方法正在返回列表:

Collection<String> getStrings();

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

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

xoshrz7s8#

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

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

ncgqoxb09#

世界上没有“第一个”这样的东西 Collection 因为它是。。好吧,只是一个收藏。
从java doc的collection.iterator()方法:
对于元素返回的顺序没有任何保证。。。
所以你不能。
如果使用其他界面(如列表),则可以执行以下操作:

String first = strs.get(0);

但直接从一个集合这是不可能的。

suzh9iv8

suzh9iv810#

在Java8中,有许多操作符可以使用,例如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);
}
rm5edbpk

rm5edbpk11#

iterables.get(yourc,indexyouwant)
因为真的,如果你用的是收藏,你应该用谷歌收藏。

ru9i0ody

ru9i0ody12#

Guava提供
onlyElement Collector ,但仅当希望集合只有一个元素时才使用它。

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

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

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

相关问题