获取 Java 集合的最后一个元素

问题描述 投票:0回答:10

我有一个集合,我想获取它的最后一个元素。最直接、最快捷的方法是什么?

一个解决方案是首先

toArray()
,然后返回数组的最后一个元素。还有其他更好的吗?

java collections
10个回答
66
投票

A

Collection
不是一个必然有序的元素集,因此可能不存在“最后一个”元素的概念。如果您想要订购的东西,您可以使用
SortedSet
/
NavigableSet
,它有一个
last()
方法。或者您可以使用
List
并致电
mylist.get(mylist.size()-1);

如果您真的需要最后一个元素,您应该使用

List
SortedSet
/
NavigableSet
。但是,如果您拥有的只是一个
Collection
并且您真的非常非常需要最后一个元素,您可以使用 toArray() 或者您可以使用
Iterator
并迭代到列表的末尾。
例如:

public Object getLastElement(final Collection c) { final Iterator itr = c.iterator(); Object lastElement = itr.next(); while(itr.hasNext()) { lastElement = itr.next(); } return lastElement; }



61
投票

Iterables.getLast

 来自 Google Guava。
它也对 
List
SortedSet
进行了一些优化。
    


16
投票

collectionName.stream().reduce((prev, next) -> next).orElse(null)



14
投票

public static <T> T getFirstElement(final Iterable<T> elements) { return elements.iterator().next(); } public static <T> T getLastElement(final Iterable<T> elements) { T lastElement = null; for (T element : elements) { lastElement = element; } return lastElement; }



10
投票

list.get(list.size()-1)

编辑:您必须先将集合转换为列表,然后才能像这样:new ArrayList(coll)


6
投票

Object lastElement = null; for (Iterator collectionItr = c.iterator(); collectionItr.hasNext(); ) { lastElement = collectionItr.next(); }



0
投票
last()

first()
方法。要获取最后一个方法,您可以在列表上执行
get(size() - 1)
或反转列表并执行
get(0)
。我认为没有必要在任何 Collection API 中使用
last()
方法,除非您正在处理
Stacks
Queues
    


0
投票

Collection<X> items = ...; X last = null; for (X x : items) last = x;



0
投票

Iterator<String> sourceIterator = Arrays.asList("one", "two", "three").iterator(); Iterable<String> iterable = () -> sourceIterator; String last = StreamSupport.stream(iterable.spliterator(), false).reduce((first, second) -> second).orElse(null);



0
投票

c.stream().skip(c.size() - 1).findFirst().orElseThrow()

如果集合是提供内置机制来获取最后一个元素的类型(例如 

SequencedCollection

 类型 — 
List
SortedSet
LinkedHashSet
等),则通常是比使用该类型提供的机制效率低得多。如果您事先不知道
Collection
类型,但想要针对这种非常常见的情况进行优化,您可以这样做:
Collection<Integer> c = getCollection();

String last = c instanceof SequencedCollection<String> s 
        ? s.getLast()
        : c.stream().skip(c.size() - 1).findFirst()
                .orElseThrow(NoSuchElementException::new);

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