Wie kann ich den letzten Wert einer ArrayList erhalten?
Antworten
Zu viele Anzeigen?Es gibt keine elegant Weg, das letzte Element einer Liste in Java zu erhalten (im Vergleich zu z.B. items[-1]
in Python).
Sie müssen Folgendes verwenden list.get(list.size()-1)
.
Bei der Arbeit mit Listen, die durch komplizierte Methodenaufrufe erhalten werden, liegt die Abhilfe in temporären Variablen:
List<E> list = someObject.someMethod(someArgument, anotherObject.anotherMethod());
return list.get(list.size()-1);
Dies ist die einzige Möglichkeit, hässliche und oft teure oder gar nicht funktionierende Versionen zu vermeiden:
return someObject.someMethod(someArgument, anotherObject.anotherMethod()).get(
someObject.someMethod(someArgument, anotherObject.anotherMethod()).size() - 1
);
Es wäre schön, wenn dieser Konstruktionsfehler in der Java-API behoben würde.
Wie in der Lösung angegeben, muss die List
leer ist, wird ein IndexOutOfBoundsException
geworfen wird. Eine bessere Lösung ist die Verwendung der Optional
Typ:
public class ListUtils {
public static <T> Optional<T> last(List<T> list) {
return list.isEmpty() ? Optional.empty() : Optional.of(list.get(list.size() - 1));
}
}
Wie zu erwarten, wird das letzte Element der Liste als Optional
:
var list = List.of(10, 20, 30);
assert ListUtils.last(list).orElse(-1) == 30;
Auch mit leeren Listen geht es gut zurecht:
var emptyList = List.<Integer>of();
assert ListUtils.last(emptyList).orElse(-1) == -1;
Falls Sie ein Spring-Projekt haben, können Sie auch die CollectionUtils.lastElement
von Spring ( javadoc ), so dass Sie keine zusätzliche Abhängigkeit wie Google Guava hinzufügen müssen.
Es ist null-sicher, wenn Sie also null übergeben, erhalten Sie einfach null zurück. Seien Sie jedoch vorsichtig bei der Behandlung der Antwort.
Hier sind einige Unit-Tests, um sie zu demonstrieren:
@Test
void lastElementOfList() {
var names = List.of("John", "Jane");
var lastName = CollectionUtils.lastElement(names);
then(lastName)
.as("Expected Jane to be the last name in the list")
.isEqualTo("Jane");
}
@Test
void lastElementOfSet() {
var names = new TreeSet<>(Set.of("Jane", "John", "James"));
var lastName = CollectionUtils.lastElement(names);
then(lastName)
.as("Expected John to be the last name in the list")
.isEqualTo("John");
}
Nota: org.assertj.core.api.BDDAssertions#then(java.lang.String)
wird für Behauptungen verwendet.