[java] Java : 컬렉션에서 첫 번째 항목 가져 오기

과 같은 컬렉션이있는 경우 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();