Java 8 IntStream을 List로 어떻게 변환합니까?


283

나는에 대한 문서 찾고 있어요 IntStream, 그리고 나는 볼 toArray방법을,하지만 방법은 직접 갈하기List<Integer>

Stream를 a 로 변환하는 방법 이 List있습니까?


이 링크를 사용해보십시오 : stackoverflow.com/questions/14830313/…
Vaibhav Jain

2
@KarlRichter 다른 질문은 유형 목록을 제공하지 않습니다. 또한이 질문은 4 년 전부터 왔으며 300 개 이상의 공감대에 대한 답변이 있습니다. 왜 지금 병합하려고합니까?
Eric Wilson

답변:


541

IntStream::boxed

IntStream::boxed는 회전 IntStreamStream<Integer>다음, 어떤 작업을 수행 할 수 있습니다 collectList:

theIntStream.boxed().collect(Collectors.toList())

boxed메소드는의 int프리미티브 값 IntStreamInteger객체 스트림으로 변환 합니다. "복싱" 이라는 단어 는 intInteger변환 과정을 나타냅니다. Oracle Tutorial을 참조하십시오 .


1
@ skiwi 나는 다른 모든 답변이 자연스럽지 않기 때문에이 답변 후에 필요하지 않다는 것을 의미합니다.
Dmitry Ginzburg

1
상자에 넣은 방법을 아직 보지 못했지만 매력처럼 작동했습니다.
twreid

추가 : 정적 가져 오기를 사용하면이 코드가 조금 더 짧고 명확하고 예쁘게된다고 생각합니다 toList. 파일 가져 오기 중에 다음을 배치하면 static import java.util.stream.Collectors.toList;됩니다.. 그런 다음 수집 호출은 단지 읽습니다 .collect(toList()).
Lii

1
Eclipse에서 IDE가 메소드에 대한 정적 가져 오기를 추가하도록 할 수 있습니다. 환경 설정 -> Java- > 편집기 -> 컨텐츠 지원 -> 즐겨 찾기에Collectors 클래스를 추가하면 됩니다. 그런 다음 IDE를 채우고 정적 가져 오기를 추가하려면 적중 Ctr + Space 만 입력하면됩니다 . toLitoList
Lii

2
내가 시도한 것에 문제가있는 것에 대해 머리카락을 찢어 버리고있었습니다. boxed()부분 을 지적 해 주셔서 감사합니다
K Raphael

16

Stream에서 mapToObj ()를 사용할 수도 있습니다. IntFunction을 사용하고 지정된 함수를이 스트림의 요소에 적용한 결과로 구성된 객체 값 스트림을 반환합니다.

List<Integer> intList = myIntStream.mapToObj(i->i).collect(Collectors.toList());

4
아이러니 한 일로, 이것이 boxed()위임하는 것입니다.
Makoto

9

Eclipse 콜렉션 에서 사용 가능한 기본 콜렉션을 사용하고 권투를 피할 수 있습니다 .

MutableIntList list = 
    IntStream.range(1, 5)
    .collect(IntArrayList::new, MutableIntList::add, MutableIntList::addAll);

참고 : 저는 Eclipse Collections에 기고자입니다.


6
이클립스 컬렉션은 일반적으로 매우 유용하지만, 전혀 도움이되지 않는 것처럼 보이지 않습니다. :)
Ben

1
EC 9.0부터 프리미티브 스트림에서 프리미티브 목록을 작성할 수 있습니다. MutableIntList list = IntLists.mutable.withAll(IntStream.range(1, 5))
Donald Raab

1
이것은 내가 찾고있는 것입니다 .. 정수 스트림에 정수 또는 객체를 복싱하는 것은 다른 것입니다
Vikash

2

Java 8을 사용하여 각 int 요소의 제곱을 찾는 다음 예제를 찾으십시오.

IntStream ints = Arrays.stream(new int[] {1,2,3,4,5});       
List<Integer> intsList = ints.map(x-> x*x)
          .collect(ArrayList<Integer>::new, ArrayList::add, ArrayList::addAll);

0

collect 메소드를 사용할 수 있습니다.

IntStream.of(1, 2, 3).collect(ArrayList::new, List::add, List::addAll);

실제로 이것은 객체 스트림에서 .collect (Collectors.toList ())를 호출 할 때 Java가 수행하는 작업과 거의 동일합니다.

public static <T> Collector<T, ?, List<T>> toList() {
    return new Collectors.CollectorImpl(ArrayList::new, List::add, (var0, var1) -> {
        var0.addAll(var1);
        return var0;
    }, CH_ID);
}

참고 : 세 번째 매개 변수는 병렬 콜렉션을 실행하려는 경우에만 필요합니다. 처음 두 개만 제공하는 순차적 인 수집으로 충분합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.