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;
}
collectionName.stream().reduce((prev, next) -> next).orElse(null)
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;
}
list.get(list.size()-1)
编辑:您必须先将集合转换为列表,然后才能像这样:new ArrayList(coll)
Object lastElement = null;
for (Iterator collectionItr = c.iterator(); collectionItr.hasNext(); ) {
lastElement = collectionItr.next();
}
last()
或
first()
方法。要获取最后一个方法,您可以在列表上执行 get(size() - 1)
或反转列表并执行 get(0)
。我认为没有必要在任何 Collection API 中使用 last()
方法,除非您正在处理 Stacks
或 Queues
Collection<X> items = ...;
X last = null;
for (X x : items) last = x;
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);
c.stream().skip(c.size() - 1).findFirst().orElseThrow()
如果集合是提供内置机制来获取最后一个元素的类型(例如
类型 —
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);