Collection<String> strs
のようなコレクションを持っている場合、どうやって最初のアイテムを取り出すことができますか?私はただIterator
を呼び、最初のnext()
を取り、そしてIterator
を捨てることができます。それをするためのより無駄の少ない方法はありますか?
Iterables.get(あなたの、インデックスが欲しい)
コレクションを使用しているのであれば、実際にはGoogleコレクションを使用しているはずです。
それがそれをするための最良の方法であるように見えます:
String first = strs.iterator().next();
大変な質問ですが...最初は、Collection
インターフェースの見落としのようです。
"first"は常にコレクションに最初に入れたものを返すわけではなく、順序付けられたコレクションに対してのみ意味がある場合があります。たぶんそれがget(item)
呼び出しがない理由です、なぜなら順序は必ずしも保存されないからです。
それは少し無駄に思えるかもしれませんが、それはあなたが思うほど悪くないかもしれません。 Iterator
は実際にはコレクション内のインデックス情報を含んでいるだけで、通常はコレクション全体のコピーではありません。このメソッドを呼び出すとIterator
オブジェクトがインスタンス化されますが、それが実際に唯一のオーバーヘッドです(すべての要素をコピーするのとは異なります)。
たとえば、ArrayList<String>.iterator()
メソッドによって返される型を見ると、それがArrayList::Itr
であることがわかります。これは、コピーするのではなく、単にリストの要素に直接アクセスする内部クラスです。
実装によっては空またはnull
になる可能性があるため、iterator()
の戻り値を必ず確認してください。
Java 8の場合:
Optional<String> firstElement = collection.stream().findFirst();
古いバージョンのJavaでは、GuavaにgetFirstメソッドがあります Iterables 。
Iterables.getFirst(iterable, defaultValue)
Collection
には「最初の」項目というものはありません。それは単なるコレクションだからです。
Javaドキュメントの Collection.iterator() メソッドから:
要素が返される順序に関する保証はありません...
だからできません。
Listのような他のインターフェースを使用すると、次のことができます。
String first = strs.get(0);
しかし、コレクションから直接これを行うことはできません。
あなたのコレクションはリストのようになりたいと思うので、私はお勧めします:
List<String> myList = new ArrayList<String>();
...
String first = myList.get(0);
Java 8では、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);
}
あなたはキャスティングをすることができます。たとえば、この定義を持つメソッドが1つ存在し、このメソッドがListを返していることがわかります。
Collection<String> getStrings();
そしてそれを呼び出した後、あなたは最初の要素が必要です、あなたはこのようにそれをすることができます:
List<String> listString = (List) getStrings();
String firstElement = (listString.isEmpty() ? null : listString.get(0));
GuavaはonlyElement
Collector
を提供しますが、コレクションがちょうど1つの要素を持つことを期待する場合にのみそれを使用してください。
Collection<String> stringCollection = ...;
String string = collection.stream().collect(MoreCollectors.onlyElement())
要素の数がわからない場合は、findFirst
を使用してください。
Optional<String> optionalString = collection.stream().findFirst();
それは完全にあなたがどの実装を使ったか、arraylist linkedlist、あるいは他のsetの実装に依存します。
それが設定されているならば、あなたは直接最初の要素を得ることができます、そして、それらはコレクションの上でトリックループであることができます。
それがリストの実装であるならば、それはインデックス番号を定義することによって簡単です。
コレクションがキューであることがわかっている場合は、コレクションをキューにキャストして簡単に取得できます。
注文を取得するために使用できる構造はいくつかありますが、それにキャストする必要があります。