#java #guava
#java #гуава
Вопрос:
Существует ли какой-либо эквивалент Collections.getOnlyElement(), который работает с массивами?
Я знаю, что это тривиальная функция для реализации, но Collections.getOnlyElement() тоже есть, и она в guava.
Комментарии:
1. Получить единственный элемент, хранящийся в массиве, просто
myArray[0]
. Есть ли в вашем массиве что-то примечательное, для чего потребовалось бы нечто большее?2. @Votey — Да, добавление проверки, если (myArray.length != 1) вызовет новое исключение RuntimeException(…)
3. Если это произойдет, я предполагаю, что myArray равен null
Ответ №1:
Iterators.getOnlyElement(Iterators.forArray(array))
С помощью Iterators.forArray
вы можете обойти необходимость создания копии этого массива в виде списка и вместо этого выполнить итерацию по самому массиву. Затем используйте Iterators.getOnlyElement
для получения первого элемента из итератора.
Ответ №2:
Не очень приятный, но все же однострочный:
Object x = Iterables.getOnlyElement(Arrays.asList(t));
Комментарии:
1. Я бы не стал преобразовывать его в список только для этого, оно того не стоит.
2. @ripper234 Я думаю, что сборщик мусора может обработать один дополнительный объект.
3. @ripper234: На случай, если вы не в курсе,
Arrays.asList
не копирует входной массив, он просто создаетList
его представление.4. Я думаю, это самое чистое, что мы получим.
5. Ну, чтобы быть справедливым, как указывает Колинд, это действительно делает то же самое.
Arrays.asList
просто возвращает список, который обертывает итератор, возвращенныйIterators.forArray
. Не думаю, что вы увидите разницу в производительности в любом случае.
Ответ №3:
if(myArray != null amp;amp; myArray.length == 1)
return myArray[0]
Кстати. массив может быть ненулевым и иметь длину 0, если инициализирован следующим образом:
MyType[] myArr = new MyType[0];
Комментарии:
1. Не очень хорошо, семантика требует создания исключения, если массив не имеет длины 1. Я не спрашивал, как это реализовать, я знаю, что реализация тривиальна … Я спросил, реализовано ли это где-нибудь.
2. Я так не думаю, поскольку массивы — это своего рода устаревшая концепция со времен, предшествовавших ООП. Я думаю, лучшее решение — определить такой метод самостоятельно где-нибудь во вспомогательном классе, если вам это нужно для создания исключения.
Ответ №4:
Я не знаю ни одного библиотечного метода, который делает это. Это кажется слишком простым, чтобы стоить затраченных усилий.
Самое близкое, с чем я столкнулся (после просмотра страниц результатов поиска), — это это — uk.org.retep.util.collections.ArrayUtils.getFirst
— которое имеет смысл, отличный от того, о чем вы просите.
Комментарии:
1. Почему Collections.getOnlyElement() является «слишком простым, чтобы стоить затраченных усилий»?
2. @ripper234 — это хороший вопрос. Все, что я могу сказать, это то, что если кто-то действительно считает, что это стоит усилий, то он либо ленив, либо прячет свой код где-то, что трудно найти.