과 같은 컬렉션이있는 경우 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
구현에 따라 리턴 될 수 있는지 확인하십시오 .
자바 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);
}
Guava는을 제공 onlyElement
Collector
하지만 컬렉션에 정확히 하나의 요소가있는 경우에만 사용하십시오.
Collection<String> stringCollection = ...;
String string = collection.stream().collect(MoreCollectors.onlyElement())
얼마나 많은 요소가 있는지 잘 모르는 경우을 사용하십시오 findFirst
.
Optional<String> optionalString = collection.stream().findFirst();
컬렉션이 대기열이라는 것을 알고 있으면 컬렉션을 대기열로 캐스팅하여 쉽게 가져올 수 있습니다.
주문을 얻는 데 사용할 수있는 몇 가지 구조가 있지만 주문해야합니다.
기능적인 방법 :
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];
Collection에 대한 javadoc은 배열 요소의 다음과 같은 경고를 제공합니다.
이 컬렉션이 요소가 iterator에 의해 리턴되는 순서를 보증하는 경우,이 메소드는 요소를 동일한 순서로 리턴해야합니다.