如何获取List或Set的第一个元素?

use*_*949 264 java collections list set

我想知道我是否可以获得列表或集合的第一个元素.使用哪种方法?

sta*_*ker 288

请参阅javadoc

列表

list.get(0);
Run Code Online (Sandbox Code Playgroud)

设置

set.iterator().next();
Run Code Online (Sandbox Code Playgroud)

并在调用之前检查大小,然后再使用上述方法 isEmpty()

!list_or_set.isEmpty()
Run Code Online (Sandbox Code Playgroud)

  • 使用`isEmpty()`而不是`size()> 0`.它更好地显示了您的意图并且可能更有效(例如,LinkList size()是O(n)). (10认同)
  • @SteveKuo LinkedList有一个大小变量,因此size()是O(1).另外,isEmpty()实现为size()== 0. (7认同)
  • 总是使用`List.iterator().next()`或`Set.iterator().next()`来避免链接数据结构的O(N),你永远不知道你将收到什么实现,当然要验证通过使用`Set.isEmpty()` 或`List.isEmpty()` 出于同样的原因,这两种情况将始终是 O(1) 而不是潜在的 O(N),如果再次是 Linked 数据结构的实现被传递喜欢 `LinkedList` 或 `LinkedHashSet` (2认同)

小智 261

Collection c;

Iterator iter = c.iterator();

Object first = iter.next();
Run Code Online (Sandbox Code Playgroud)

(这是你最接近a的"第一"元素Set.你应该意识到它对于大多数实现来说绝对没有意义Set.这可能对LinkedHashSet和TreeSet有意义,但对HashSet没有意义.)

  • 如果您的集合只有一个元素就足够了. (8认同)
  • 如果您只想尽快从集合中获取任何内容,这将非常有用 (4认同)

Son*_*123 110

在Java> = 8中,您还可以使用Streaming API:

Optional<String> first = set.stream().findFirst();
Run Code Online (Sandbox Code Playgroud)

(如果Set/List可能为空,则有用.)

  • @Diablo但要小心,因为如果可选项为空,`get()`将抛出异常."Optional"上有很多其他方法可能更合适. (3认同)
  • 如果你希望它返回 null,只需执行 `String first = set.stream().findFirst().orElse(null);` (3认同)
  • @troosan这仍然不是空安全的,因为集合的第一个元素可以是“null”,在这种情况下“findFirst()”将抛出NPE。null 安全的方法是使用类似:`set.stream().map(Optional::ofNullable).findFirst().orElseGet(Optional::empty).orElse(null)`。首先,我们将流的第一个元素包装到Optional中,然后,在`findFirst()`(它将我们的Optional包装到另一个Optional中)之后,我们将其解开,或者如果Set为空则返回`Optional.empty()`。最后,我们返回 Set 的第一个元素或 null。 (2认同)

Ch *_*Vas 29

让我们假设你有一个List<String> strings你想要的第一个项目.

有几种方法可以做到这一点:

Java(8之前):

String firstElement = null;
if (!strings.isEmpty() && strings.size() > 0) {
    firstElement = strings.get(0);
}
Run Code Online (Sandbox Code Playgroud)

Java 8:

Optional<String> firstElement = strings.stream().findFirst();
Run Code Online (Sandbox Code Playgroud)

番石榴

String firstElement = Iterables.getFirst(strings, null);
Run Code Online (Sandbox Code Playgroud)

Apache commons(4+)

String firstElement = (String) IteratorUtils.get(strings, 0);
Run Code Online (Sandbox Code Playgroud)

Apache公共(4之前)

String firstElement = (String) CollectionUtils.get(strings, 0);
Run Code Online (Sandbox Code Playgroud)

随后或封装在适当的检查或try-catch块中.

科特林:

在Kotlin中,数组和大多数集合(例如:List)都有一个first方法调用.所以你的代码看起来像这样

列表:

val stringsList: List<String?> = listOf("a", "b", null)
val first: String? = stringsList.first()
Run Code Online (Sandbox Code Playgroud)

对于数组:

val stringArray: Array<String?> = arrayOf("a", "b", null)
val first: String? = stringArray.first()
Run Code Online (Sandbox Code Playgroud)


Rad*_*icz 19

我很惊讶没有人建议番石榴解决方案:

com.google.common.collect.Iterables.get(collection, 0)
// or
com.google.common.collect.Iterables.get(collection, 0, defaultValue)
// or
com.google.common.collect.Iterables.getFirst(collection, defaultValue)
Run Code Online (Sandbox Code Playgroud)

或者如果您期望单个元素:

com.google.common.collect.Iterables.getOnlyElement(collection, defaultValue)
// or
com.google.common.collect.Iterables.getOnlyElement(collection)
Run Code Online (Sandbox Code Playgroud)


Vas*_*hev 11

set.toArray()[0];
Run Code Online (Sandbox Code Playgroud)

名单

list.get(0);
Run Code Online (Sandbox Code Playgroud)

  • `set.toArray()[0]`必须通过整个集合内容来创建一个数组才能获得第一个元素,这不是很有效. (16认同)
  • 这将导致非常低的性能 (2认同)

Nis*_*til 8

等等

Set<String> set = new TreeSet<>();
    set.add("2");
    set.add("1");
    set.add("3");
    String first = set.stream().findFirst().get();
Run Code Online (Sandbox Code Playgroud)

这将帮助您检索列表或集的第一个元素.假设set或list不为空(get()在空可选时将抛出java.util.NoSuchElementException)

orElse() 可以用作:(这只是一种解决方法 - 不推荐)

String first = set.stream().findFirst().orElse("");
set.removeIf(String::isEmpty);
Run Code Online (Sandbox Code Playgroud)

以下是适当的方法:

Optional<String> firstString = set.stream().findFirst();
if(firstString.isPresent()){
    String first = firstString.get();
}
Run Code Online (Sandbox Code Playgroud)

类似地,可以检索列表的第一个元素.

希望这可以帮助.


mol*_*olm 6

这不是这个问题的精确答案,但是如果对象应该排序,SortedSet有一个first()方法:

SortedSet<String> sortedSet = new TreeSet<String>();
sortedSet.add("2");
sortedSet.add("1");
sortedSet.add("3");
String first = sortedSet.first(); //first="1"
Run Code Online (Sandbox Code Playgroud)

排序的对象必须实现Comparable接口(就像String一样)