などのコレクションがある場合Collection<String> strs
、どのようにして最初のアイテムを入手できますか?私は単にを呼び出し、Iterator
最初next()
にを取り、次に捨てIterator
ます。無駄を省く方法はありますか?
などのコレクションがある場合Collection<String> strs
、どのようにして最初のアイテムを入手できますか?私は単にを呼び出し、Iterator
最初next()
にを取り、次に捨てIterator
ます。無駄を省く方法はありますか?
回答:
Iterables.get(yourC、indexYouWant)
というのも、コレクションを使用している場合は、Googleコレクションを使用する必要があるからです。
それがそれを行うための最良の方法であるように見えます:
String first = strs.iterator().next();
すばらしい質問...最初は、Collection
インターフェースの見落としのようです。
「first」は常にコレクションに最初に置いたものを返すとは限らず、順序付けられたコレクションに対してのみ意味があることに注意してください。get(item)
注文が必ずしも保持されるわけではないので、たぶんそれが呼び出しがない理由です。
それは少し無駄に見えるかもしれませんが、あなたが思うほど悪くはないかもしれません。Iterator
本当にただのコレクション、コレクション全体のない通常コピーにインデックス情報が含まれています。このメソッドを呼び出すとIterator
オブジェクトがインスタンス化されますが、それが実際に唯一のオーバーヘッドです(すべての要素をコピーするようなものではありません)。
たとえば、ArrayList<String>.iterator()
メソッドによって返された型を見ると、それがであることがわかりArrayList::Itr
ます。これは、リストの要素をコピーするのではなく、直接アクセスするだけの内部クラスです。
iterator()
空であるかnull
、実装に依存している可能性があるため、の戻り値を確認してください。
Java 8の場合:
Optional<String> firstElement = collection.stream().findFirst();
古いバージョンのJavaでは、Guava Iterablesに getFirstメソッドがあります。
Iterables.getFirst(iterable, defaultValue)
getFirst
利用できる方法がありません。ありget
、getLast
方法
Collection
単なるコレクションなので、「最初の」アイテムなどはありません。
Java docのCollection.iterator()メソッドから:
要素が返される順序に関する保証はありません...
だからできません。
Listなどの別のインターフェースを使用する場合は、次のことができます。
String first = strs.get(0);
しかし、コレクションから直接これを行うことはできません。
get(int n)
定義されているとは思いませんCollection
Java 8では、たとえば制限など、使用する演算子がいくつかあります
/**
* 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);
}
コレクションがキューであることを知っている場合は、コレクションをキューにキャストして簡単に取得できます。
注文を取得するために使用できる構造がいくつかありますが、それにキャストする必要があります。
これは、使用した実装、arraylist linkedlist、または他のsetの実装に完全に依存します。
これが設定されている場合、最初の要素を直接取得できます。それらは、コレクションに対するトリックループであり、値1の変数を作成し、そのループを解除した後、フラグ値が1のときに値を取得します。
リストの実装であれば、インデックス番号を定義することで簡単です。
機能的な方法:
public static <T> Optional<T> findFirst(List<T> result) {
return Optional.ofNullable(result)
.map(List::stream)
.flatMap(Stream::findFirst);
}
上記のコードスニペットは、NullPointerExceptionおよびIndexOutOfBoundsExceptionから保持されます。
List<T>
機能するという条件を満たしていませんCollection<String>
が、もちろん、を使用Collection<T>
して修正することができ、追加の変更が必要です.map(Collection::stream)
。
あなたはこれを行うことができます:
String strz[] = strs.toArray(String[strs.size()]);
String theFirstOne = strz[0];
コレクションのjavadocは、配列の要素の次の警告wrt順序を提供します。
このコレクションが反復子によって要素が返される順序について保証する場合、このメソッドは要素を同じ順序で返す必要があります。