如果我有一个集合,如集合<String> strs,我怎么能得到第一项?我可以调用一个迭代器,取它的第一个next(),然后丢弃迭代器。有没有更少浪费的方法呢?
当前回答
看起来这是最好的方法:
String first = strs.iterator().next();
好问题……起初,这似乎是Collection接口的一个疏忽。
请注意,“first”并不总是返回您放入集合中的第一个东西,并且可能只对有序集合有意义。也许这就是没有get(item)调用的原因,因为不一定要保留顺序。
虽然这看起来有点浪费,但可能没有你想的那么糟糕。Iterator实际上只是将索引信息包含到集合中,通常不是整个集合的副本。调用此方法确实实例化了Iterator对象,但这实际上是唯一的开销(不像复制所有元素)。
例如,查看ArrayList<String>.iterator()方法返回的类型,我们看到它是ArrayList::Itr。这是一个内部类,它直接访问列表中的元素,而不是复制它们。
只是要确保检查iterator()的返回值,因为它可能是空的或空的,这取决于实现。
其他回答
看起来这是最好的方法:
String first = strs.iterator().next();
好问题……起初,这似乎是Collection接口的一个疏忽。
请注意,“first”并不总是返回您放入集合中的第一个东西,并且可能只对有序集合有意义。也许这就是没有get(item)调用的原因,因为不一定要保留顺序。
虽然这看起来有点浪费,但可能没有你想的那么糟糕。Iterator实际上只是将索引信息包含到集合中,通常不是整个集合的副本。调用此方法确实实例化了Iterator对象,但这实际上是唯一的开销(不像复制所有元素)。
例如,查看ArrayList<String>.iterator()方法返回的类型,我们看到它是ArrayList::Itr。这是一个内部类,它直接访问列表中的元素,而不是复制它们。
只是要确保检查iterator()的返回值,因为它可能是空的或空的,这取决于实现。
在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);
}
你可以这样做:
String strz[] = strs.toArray(String[strs.size()]);
String theFirstOne = strz[0];
javadoc for Collection给出了如下数组元素的顺序:
如果该集合对其迭代器返回元素的顺序有任何保证,则该方法必须以相同的顺序返回元素。
Guava提供了一个onlyElement Collector,但只有在希望集合只有一个元素时才使用它。
Collection<String> stringCollection = ...;
String string = collection.stream().collect(MoreCollectors.onlyElement())
如果不确定有多少元素,请使用findFirst。
Optional<String> optionalString = collection.stream().findFirst();
如果你在使用Apache Commons Collections 4,有一个IterableUtils。第一个方法。在列表的情况下,它包含了一个优化,使用起来很整洁。这和番石榴法很相似。代码看起来像
String firstStr = IterableUtils.first(strs);
推荐文章
- javax.transaction.Transactional vs . org.springframework.transaction.annotation.Transactional
- Java 8接口方法中不允许“同步”的原因是什么?
- 如何找到Java堆大小和内存使用(Linux)?
- 使用Enum实现单例(Java)
- RabbitMQ与通道和连接之间的关系
- buildSessionFactory()配置方法在Hibernate中已弃用?
- Spring MVC -如何获得所有的请求参数在一个地图在Spring控制器?
- 如何在Java中按两个字段排序?
- 文件之间的差异。路径中的分隔符和斜杠
- 在方法参数中使用NotNull注释
- Spring MVC中处理可选参数的@RequestParam
- Tomcat:如何查找正在运行的Tomcat版本?
- “java”、“javaw”和“javaws”之间有什么区别?
- 将Date对象转换为日历对象
- 在Java中保存最后N个元素的大小有限的队列