Java 8 스트림을 배열로 변환하는 방법?


775

Java 8 Stream을 배열로 변환하는 가장 쉬운 방법은 무엇입니까 ?


2
질문이 더 완전하고 무언가를 시도했다는 것을 보여주기 때문에 롤백을 되돌릴 것을 제안합니다.
— skiwi

2
감사합니다! 하지만 시도한 코드가 실제로 질문에 더 많은 정보를 추가하지는 않는다고 생각했지만 아무도 "우리에게 당신의 시도를 보여줘"라고 비명을 지르지 않았습니다. =)

17
@ skiwi : 나는 일반적으로 do-my-homework-in-me-me 질문에 소리 지르지 만이 특정 질문은 추가 혼란없이 나에게 더 분명한 것처럼 보입니다. 깔끔하게 유지합시다.
— Honza Zidek

답변:


1168

가장 쉬운 방법은 toArray(IntFunction<A[]> generator)배열 생성자 참조와 함께 메서드 를 사용하는 것입니다. 이것은 메소드 의 API 문서 에서 제안됩니다 .

String[] stringArray = stringStream.toArray(String[]::new);

그것이하는 일은 정수 (크기)를 인수로 취하고 String[]정확히 (오버로드 중 하나) 가하는 것을 반환하는 메소드를 찾는 것입니다 new String[].

당신은 또한 자신을 쓸 수 있습니다 IntFunction:

Stream<String> stringStream = ...;
String[] stringArray = stringStream.toArray(size -> new String[size]);

의 목적은 IntFunction<A[]> generator배열의 크기 인 정수를 새로운 배열로 변환하는 것입니다.

예제 코드 :

Stream<String> stringStream = Stream.of("a", "b", "c");
String[] stringArray = stringStream.toArray(size -> new String[size]);
Arrays.stream(stringArray).forEach(System.out::println);

인쇄물:

a
b
c

8
다음은 Array 생성자 참조가 실제로 작동하는 이유와 방법에 대한 설명입니다. stackoverflow.com/questions/29447561/…
— jarek.jpa

"Zenexer가 맞습니다. 해결책은 stream.toArray (String [] :: new);"입니다. ... 글쎄,하지만 메서드 참조가 논리적이고 기능적으로 동등하다는 것을 이해해야 toArray(sz -> new String[sz])하므로 솔루션이 무엇인지 또는 무엇인지 실제로 말할 수 있는지 확신 할 수 없습니다.
— scottb

3
@scottb sz -> new String[sz]는 생성자 참조가 아닌 새로운 함수를 만듭니다. 가비지 콜렉션 처닝이 얼마나 가치가 있는지에 달려 있습니다.
— WORMSS

3
@WORMSS 그렇지 않습니다. 그것은 (정적으로!) 새로운 private 메소드 를 만들어서 이탈을 일으킬 수 없으며 두 버전 모두 새로운 객체를 만들어야합니다. 참조는 대상 메소드를 직접 가리키는 오브젝트를 작성합니다. 람다는 생성 된 객체를 가리키는 객체를 만듭니다 private. 생성자에 대한 참조는 간접적 인 결여와보다 쉬운 VM 최적화를 위해 더 나은 성능을 유지해야하지만 이탈과는 관련이 없습니다.
— HTNW

2
@HTNW 당신은 ​​정확합니다, 사과드립니다. 처음으로이 작업을 시도 할 때 이탈을 일으킨 이탈을 일으킨 디버그 시도가 실제로 이루어 졌으므로, 이것이 내 머리에 갇히게 된 것입니다. (그런 일이 발생하면 싫어하십시오).
— WORMSS

41

Stream에서 1에서 10까지의 값을 가진 정수 배열을 얻으려면 IntStream이 있습니다.

여기에서는 Stream.of 메서드를 사용하여 Stream을 만들고 mapToInt를 사용하여 Stream을 IntStream으로 변환합니다. 그런 다음 IntStream의 toArray 메소드를 호출 할 수 있습니다.

Stream<Integer> stream = Stream.of(1,2,3,4,5,6,7,8,9,10);
//or use this to create our stream 
//Stream<Integer> stream = IntStream.rangeClosed(1, 10).boxed();
int[] array =  stream.mapToInt(x -> x).toArray();

IntStream 만 사용하여 Stream이없는 동일한 내용이 있습니다.

int[]array2 =  IntStream.rangeClosed(1, 10).toArray();

15

이 간단한 코드 블록을 사용하여 Java 8 스트림을 배열로 변환 할 수 있습니다.

 String[] myNewArray3 = myNewStream.toArray(String[]::new);

그러나 먼저 더 자세히 설명해 봅시다. 먼저 세 가지 값으로 채워진 문자열 목록을 만들어 봅시다.

String[] stringList = {"Bachiri","Taoufiq","Abderrahman"};

지정된 Array에서 스트림을 만듭니다.

Stream<String> stringStream = Arrays.stream(stringList);

이제이 스트림에서 일부 작업을 수행 할 수 있습니다. 예 :

Stream<String> myNewStream = stringStream.map(s -> s.toUpperCase());

마지막으로 다음 방법을 사용하여 Java 8 Array로 변환하십시오.

1- 클래식 방법 (기능 인터페이스)

IntFunction<String[]> intFunction = new IntFunction<String[]>() {
    @Override
    public String[] apply(int value) {
        return new String[value];
    }
};


String[] myNewArray = myNewStream.toArray(intFunction);

2-람다 표현

 String[] myNewArray2 = myNewStream.toArray(value -> new String[value]);

3- 방법 참조

String[] myNewArray3 = myNewStream.toArray(String[]::new);

메소드 참조 설명 :

람다 식을 작성하는 다른 방법으로 다른 식과 완전히 동일합니다.


6

텍스트를 문자열 배열로 변환하여 각 값을 쉼표로 구분하고 모든 필드를 자릅니다 (예 :

String[] stringArray = Arrays.stream(line.split(",")).map(String::trim).toArray(String[]::new);

4

스트림을 배열로 변환하는 사용자 지정 수집기를 만들 수 있습니다.

public static <T> Collector<T, ?, T[]> toArray( IntFunction<T[]> converter )
{
    return Collectors.collectingAndThen( 
                  Collectors.toList(), 
                  list ->list.toArray( converter.apply( list.size() ) ) );
}

빠른 사용

List<String> input = Arrays.asList( ..... );

String[] result = input.stream().
         .collect( CustomCollectors.**toArray**( String[]::new ) );

5
왜 Stream.toArray (IntFunction) 대신 이것을 사용 하시겠습니까?
— Didier L

Collectors.groupingBy속성 값당 객체 배열에 일부 속성을 매핑 할 수 있도록 2 개의 인수로 전달할 수집기가 필요했습니다 . 이 대답은 바로 저에게 있습니다. 또한 @DidierL.
— Ole VV

3

사용하여 toArray(IntFunction<A[]> generator) 방법을 것은 실제로 스트림을 동일한 유형의 스트림 배열로 변환 (또는 더 정확하게 수집)하는 매우 우아하고 안전한 방법입니다.

반환 된 배열의 형식이 중요하지 않은 경우, 간단하게 사용하는 toArray()방법은 모두 쉽게 하고 짧은. 예를 들면 다음과 같습니다.

    Stream<Object> args = Stream.of(BigDecimal.ONE, "Two", 3);
    System.out.printf("%s, %s, %s!", args.toArray());

0
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);

int[] arr=   stream.mapToInt(x->x.intValue()).toArray();

0
import java.util.List;
import java.util.stream.Stream;

class Main {

    public static void main(String[] args) {
        // Create a stream of strings from list of strings
        Stream<String> myStreamOfStrings = List.of("lala", "foo", "bar").stream();

        // Convert stream to array by using toArray method
        String[] myArrayOfStrings = myStreamOfStrings.toArray(String[]::new);

        // Print results
        for (String string : myArrayOfStrings) {
            System.out.println(string);
        }
    }
}

온라인으로 사용해보십시오 : https://repl.it/@SmaMa/Stream-to-array


답변과 수락 된 답변의 차이점은 무엇입니까?
— Long Nguyen

@LongNguyen 스 니펫뿐만 아니라 온라인 재생 시나리오를 포함한 전체 예입니다.
— Sma Ma


-2

모든 방법은 기술적으로 동일하지만 Lambda를 사용하면 일부 코드가 단순화됩니다. 먼저 String을 사용하여 List를 초기화하고 person이라고하자.

List<String> persons = new ArrayList<String>(){{add("a"); add("b"); add("c");}};
Stream<String> stream = persons.stream();

이제 다음 방법 중 하나를 사용할 수 있습니다.

  1. Lambda Expresiion을 사용하여 정의 된 크기의 새 StringArray를 만듭니다.

    String [] stringArray = stream.toArray (크기-> 새 문자열 [크기]);

  2. 메소드 참조를 직접 사용합니다.

    String [] stringArray = stream.toArray (String [] :: 새);

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