如果我有一个集合,如集合<String> strs,我怎么能得到第一项?我可以调用一个迭代器,取它的第一个next(),然后丢弃迭代器。有没有更少浪费的方法呢?
当前回答
你可以选角。例如,如果存在一个具有此定义的方法,并且您知道该方法将返回一个List:
Collection<String> getStrings();
调用它之后,你需要第一个元素,你可以这样做:
List<String> listString = (List) getStrings();
String firstElement = (listString.isEmpty() ? null : listString.get(0));
其他回答
如果知道集合是队列,则可以将集合强制转换为队列并轻松获取它。
您可以使用几个结构来获得订单,但需要对其进行强制转换。
Guava提供了一个onlyElement Collector,但只有在希望集合只有一个元素时才使用它。
Collection<String> stringCollection = ...;
String string = collection.stream().collect(MoreCollectors.onlyElement())
如果不确定有多少元素,请使用findFirst。
Optional<String> optionalString = collection.stream().findFirst();
看起来这是最好的方法:
String first = strs.iterator().next();
好问题……起初,这似乎是Collection接口的一个疏忽。
请注意,“first”并不总是返回您放入集合中的第一个东西,并且可能只对有序集合有意义。也许这就是没有get(item)调用的原因,因为不一定要保留顺序。
虽然这看起来有点浪费,但可能没有你想的那么糟糕。Iterator实际上只是将索引信息包含到集合中,通常不是整个集合的副本。调用此方法确实实例化了Iterator对象,但这实际上是唯一的开销(不像复制所有元素)。
例如,查看ArrayList<String>.iterator()方法返回的类型,我们看到它是ArrayList::Itr。这是一个内部类,它直接访问列表中的元素,而不是复制它们。
只是要确保检查iterator()的返回值,因为它可能是空的或空的,这取决于实现。
Iterables。get (indexYouWant yourC)
因为实际上,如果你使用集合,你应该使用谷歌集合。
功能:
public static <T> Optional<T> findFirst(List<T> result) {
return Optional.ofNullable(result)
.map(List::stream)
.flatMap(Stream::findFirst);
}
上面的代码片段保留NullPointerException和IndexOutOfBoundsException
推荐文章
- 如何允许所有网络连接类型HTTP和HTTPS在Android(9)馅饼?
- Intellij IDEA Java类在保存时不能自动编译
- 何时使用Mockito.verify()?
- 在maven中安装mvn到底做什么
- 不可变与不可修改的集合
- 如何在JSON中使用杰克逊更改字段名
- GSON -日期格式
- 如何从线程捕获异常
- 无法解析主机"<URL here>"没有与主机名关联的地址
- 如何在Java中打印二叉树图?
- String.format()在Java中格式化双重格式
- com.jcraft.jsch.JSchException: UnknownHostKey
- Java中的操作符重载
- 如何加速gwt编译器?
- 在Hibernate中重新连接分离对象的正确方法是什么?