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.