과 같은 컬렉션이있는 경우 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
구현에 따라 리턴 될 수 있는지 확인하십시오 .
답변
자바 8 :
Optional<String> firstElement = collection.stream().findFirst();
이전 버전의 Java의 경우 Guava Iterables에 getFirst 메소드가 있습니다 .
Iterables.getFirst(iterable, defaultValue)
답변
“첫 번째”항목 Collection
은 .. 단순히 컬렉션이기 때문에 없습니다.
Java doc의 Collection.iterator () 메소드에서 :
요소가 반환되는 순서에 대한 보장은 없습니다 …
그래서 당신은 할 수 없습니다.
List 와 같은 다른 인터페이스 를 사용 하는 경우 다음을 수행 할 수 있습니다.
String first = strs.get(0);
그러나 컬렉션에서 직접 이것은 불가능합니다.
답변
귀하의 컬렉션이 목록과 같은 것처럼 보이기 때문에 다음과 같이 제안합니다.
List<String> myList = new ArrayList<String>();
...
String first = myList.get(0);
답변
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);
}
답변
Guava는을 제공 onlyElement
Collector
하지만 컬렉션에 정확히 하나의 요소가있는 경우에만 사용하십시오.
Collection<String> stringCollection = ...;
String string = collection.stream().collect(MoreCollectors.onlyElement())
얼마나 많은 요소가 있는지 잘 모르는 경우을 사용하십시오 findFirst
.
Optional<String> optionalString = collection.stream().findFirst();