Bir koleksiyonum varsa Collection<String> strs
, ilk öğeyi nasıl çıkarabilirim? Sadece bir tane arayabilir Iterator
, ilkini alabilir next()
, sonra atabilirim Iterator
. Bunu yapmanın daha az savurgan bir yolu var mı?
Bir koleksiyonum varsa Collection<String> strs
, ilk öğeyi nasıl çıkarabilirim? Sadece bir tane arayabilir Iterator
, ilkini alabilir next()
, sonra atabilirim Iterator
. Bunu yapmanın daha az savurgan bir yolu var mı?
Yanıtlar:
Iterables.get (yourC, indexYouWant)
Çünkü gerçekten, Koleksiyonlar kullanıyorsanız Google Koleksiyonlar'ı kullanmalısınız.
Görünüşe göre bunu yapmanın en iyi yolu:
String first = strs.iterator().next();
Harika bir soru ... İlk başta, Collection
arayüz için bir gözetim gibi görünüyor .
"İlk" öğesinin her zaman koleksiyona koyduğunuz ilk şeyi döndürmeyeceğini ve yalnızca sipariş edilen koleksiyonlar için anlamlı olabileceğini unutmayın. Belki de bu yüzden bir get(item)
çağrı yoktur, çünkü sipariş mutlaka korunmaz.
Biraz savurgan gibi görünse de, düşündüğünüz kadar kötü olmayabilir. Iterator
Gerçekten sadece toplama, tüm koleksiyonun değil genellikle bir kopyası içine indeksleme bilgilerini içerir. Bu yöntemi çağırmak Iterator
nesneyi başlatır , ancak bu gerçekten tek yüktür (tüm öğeleri kopyalamak gibi değil).
Örneğin, ArrayList<String>.iterator()
yöntem tarafından döndürülen türe baktığımızda bunun olduğunu görüyoruz ArrayList::Itr
. Bu, listenin öğelerine kopyalamak yerine doğrudan erişen dahili bir sınıftır.
Sadece iterator()
boş olduğundan veya null
uygulamaya bağlı olabileceğinden dönüşünü kontrol ettiğinizden emin olun .
Java 8'de:
Optional<String> firstElement = collection.stream().findFirst();
Java'nın eski sürümleri için Guava Iterables'da bir getFirst yöntemi vardır :
Iterables.getFirst(iterable, defaultValue)
getFirst
Kullanabileceğim bir yöntem yok . Var get
ve getLast
yöntemler
Bir şey "ilk" öğe diye bir şey yoktur Collection
çünkü o .. iyi bir koleksiyon.
Java doc's Collection.iterator () yönteminden:
Elemanların iade edilme sırası ile ilgili hiçbir garanti yoktur ...
Yani yapamazsın.
Liste gibi başka bir arabirim kullanıyorsanız , aşağıdakileri yapabilirsiniz:
String first = strs.get(0);
Ancak doğrudan bir Koleksiyondan bu mümkün değildir.
get(int n)
için tanımlanmış olduğunu sanmıyorumCollection
Koleksiyonunuz Liste benzeri olmak istiyor gibi görünüyor, bu yüzden şunu öneririm:
List<String> myList = new ArrayList<String>();
...
String first = myList.get(0);
Java 8'de kullanacağınız birçok işleç var, örneğin limit
/**
* Operator that limit the total number of items emitted through the pipeline
* Shall print
* [1]
* @throws InterruptedException
*/
@Test
public void limitStream() throws InterruptedException {
List<Integer> list = Arrays.asList(1, 2, 3, 1, 4, 2, 3)
.stream()
.limit(1)
.collect(toList());
System.out.println(list);
}
Guava bir sağlar onlyElement
Collector
, ancak yalnızca koleksiyonun tam olarak bir öğeye sahip olmasını bekliyorsanız kullanın.
Collection<String> stringCollection = ...;
String string = collection.stream().collect(MoreCollectors.onlyElement())
Kaç tane eleman olduğundan emin değilseniz kullanın findFirst
.
Optional<String> optionalString = collection.stream().findFirst();
Bir döküm yapabilirsiniz. Örneğin, bu tanıma sahip bir yöntem varsa ve bu yöntemin bir Liste döndürdüğünü biliyorsanız:
Collection<String> getStrings();
Ve çağırdıktan sonra, ilk öğeye ihtiyacınız var, bunu şöyle yapabilirsiniz:
List<String> listString = (List) getStrings();
String firstElement = (listString.isEmpty() ? null : listString.get(0));
Koleksiyonun bir kuyruk olduğunu biliyorsanız, koleksiyonu bir kuyruğa atabilir ve kolayca alabilirsiniz.
Siparişi almak için kullanabileceğiniz birkaç yapı var, ancak buna atmanız gerekecek.
Tamamen hangi uygulamayı kullandığınıza, arraylist bağlantılı listesine veya diğer set uygulamalarına bağlıdır.
ayarlanmışsa, ilk öğeyi doğrudan alabilirsiniz, koleksiyon üzerinde hile döngüsü olabilir, 1 değerinde bir değişken oluşturabilir ve bu döngüden sonra bayrak değeri 1 olduğunda değer elde edebilirsiniz.
listenin uygulanması ise, dizin numarasını tanımlamak kolaydır.
Fonksiyonel yolu:
public static <T> Optional<T> findFirst(List<T> result) {
return Optional.ofNullable(result)
.map(List::stream)
.flatMap(Stream::findFirst);
}
yukarıdaki kod snippet'i NullPointerException ve IndexOutOfBoundsException öğesinden korur
List<T>
bir için çalışması gerektiğini koşulunu yerine getirmediği Collection<String>
, ancak kullanılarak sabitlenebilir tabii Collection<T>
ek değişiklikle,: .map(Collection::stream)
.
Bunu yapabilirsin:
String strz[] = strs.toArray(String[strs.size()]);
String theFirstOne = strz[0];
Koleksiyon için javadoc, dizinin elemanlarının aşağıdaki uyarı sırasını verir:
Bu koleksiyon, öğelerinin yineleyicisi tarafından hangi sırayla döndürüleceğine dair herhangi bir garanti veriyorsa, bu yöntemin öğeleri aynı sırayla döndürmesi gerekir.