Если у меня есть коллекция, например Collection<String> strs
, как я могу достать первый предмет? Я мог бы позвонить Iterator
, взять ее сначала next()
, а потом выбросить Iterator
. Есть ли менее расточительный способ сделать это?
java
collections
iterable
Ник Хейнер
источник
источник
Ответы:
Iterables.get (yourC, indexYouWant)
Потому что на самом деле, если вы используете Коллекции, вы должны использовать Google Коллекции.
источник
Похоже, это лучший способ сделать это:
Отличный вопрос ... На первый взгляд это похоже на недосмотр
Collection
интерфейса.Обратите внимание, что «first» не всегда возвращает первое, что вы положили в коллекцию, и может иметь смысл только для упорядоченных коллекций. Может быть, поэтому нет
get(item)
звонка, поскольку порядок не обязательно сохраняется.Хотя это может показаться немного расточительным, это может быть не так плохо, как вы думаете. На
Iterator
самом деле просто содержит информацию индексации в коллекции, а не копию всего собрания. Вызов этого метода создает экземплярIterator
объекта, но на самом деле это единственные накладные расходы (не как копирование всех элементов).Например, глядя на тип, возвращаемый
ArrayList<String>.iterator()
методом, мы видим, что это такArrayList::Itr
. Это внутренний класс, который просто обращается к элементам списка напрямую, а не копирует их.Просто убедитесь, что вы проверили возврат,
iterator()
поскольку он может быть пустым илиnull
зависеть от реализации.источник
В Java 8:
Для более старых версий java есть метод getFirst в Guava Iterables :
источник
getFirst
доступных методов. Естьget
иgetLast
методыНе существует такого понятия, как «первый» элемент,
Collection
потому что это .. ну, просто коллекция.Из метода Collection.iterator () Java-документа :
Так что ты не можешь.
Если вы используете другой интерфейс, например List , вы можете сделать следующее:
Но прямо из Коллекции это невозможно.
источник
get(int n)
определено дляCollection
Похоже, ваша коллекция хочет быть похожей на список, поэтому я бы предложил:
источник
В Java 8 у вас есть несколько операторов, например, limit
источник
Guava предоставляет
onlyElement
Collector
, но использует его, только если вы ожидаете, что в коллекции будет ровно один элемент.Если вы не знаете, сколько там элементов, используйте
findFirst
.источник
Вы можете сделать кастинг. Например, если существует один метод с этим определением, и вы знаете, что этот метод возвращает список:
И после вызова вам нужен первый элемент, вы можете сделать это так:
источник
Если вы знаете, что коллекция является очередью, вы можете легко преобразовать ее в очередь.
Есть несколько структур, которые вы можете использовать, чтобы получить заказ, но вам нужно будет привести его к нему.
источник
Это полностью зависит от того, какую реализацию вы использовали, будь то ArrayList связанный список или другие реализации набора.
если он установлен, то вы можете напрямую получить первый элемент, их можно сделать цикличным циклом по коллекции, создать переменную со значением 1 и получить значение, когда значение флага равно 1, после того, как этот цикл прервется.
если это реализация списка, то это легко определить с помощью индекса.
источник
Функциональный способ:
Приведенный выше фрагмент кода сохраняется из NullPointerException и IndexOutOfBoundsException
источник
List<T>
не удовлетворяет условие , что он должен работать дляCollection<String>
, но, конечно, может быть закреплена с помощьюCollection<T>
, с дополнительным изменением:.map(Collection::stream)
.Вы могли бы сделать это:
Javadoc для Collection дает следующее предостережение относительно упорядочивания элементов массива:
источник