Массивы.getOnlyElement()?

#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 — это хороший вопрос. Все, что я могу сказать, это то, что если кто-то действительно считает, что это стоит усилий, то он либо ленив, либо прячет свой код где-то, что трудно найти.