Java 8 Stream
을 배열로 변환하는 가장 쉬운 방법은 무엇입니까 ?
Java 8 Stream
을 배열로 변환하는 가장 쉬운 방법은 무엇입니까 ?
답변:
가장 쉬운 방법은 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
toArray(sz -> new String[sz])
하므로 솔루션이 무엇인지 또는 무엇인지 실제로 말할 수 있는지 확신 할 수 없습니다.
sz -> new String[sz]
는 생성자 참조가 아닌 새로운 함수를 만듭니다. 가비지 콜렉션 처닝이 얼마나 가치가 있는지에 달려 있습니다.
private
메소드 를 만들어서 이탈을 일으킬 수 없으며 두 버전 모두 새로운 객체를 만들어야합니다. 참조는 대상 메소드를 직접 가리키는 오브젝트를 작성합니다. 람다는 생성 된 객체를 가리키는 객체를 만듭니다 private
. 생성자에 대한 참조는 간접적 인 결여와보다 쉬운 VM 최적화를 위해 더 나은 성능을 유지해야하지만 이탈과는 관련이 없습니다.
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();
이 간단한 코드 블록을 사용하여 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);
메소드 참조 설명 :
람다 식을 작성하는 다른 방법으로 다른 식과 완전히 동일합니다.
텍스트를 문자열 배열로 변환하여 각 값을 쉼표로 구분하고 모든 필드를 자릅니다 (예 :
String[] stringArray = Arrays.stream(line.split(",")).map(String::trim).toArray(String[]::new);
스트림을 배열로 변환하는 사용자 지정 수집기를 만들 수 있습니다.
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 ) );
Collectors.groupingBy
속성 값당 객체 배열에 일부 속성을 매핑 할 수 있도록 2 개의 인수로 전달할 수집기가 필요했습니다 . 이 대답은 바로 저에게 있습니다. 또한 @DidierL.
사용하여 toArray(IntFunction<A[]> generator)
방법을 것은 실제로 스트림을 동일한 유형의 스트림 배열로 변환 (또는 더 정확하게 수집)하는 매우 우아하고 안전한 방법입니다.
반환 된 배열의 형식이 중요하지 않은 경우, 간단하게 사용하는 toArray()
방법은 모두 쉽게 하고 짧은. 예를 들면 다음과 같습니다.
Stream<Object> args = Stream.of(BigDecimal.ONE, "Two", 3);
System.out.printf("%s, %s, %s!", args.toArray());
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
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);
Integer[] integers = stream.toArray(it->new Integer[it]);
모든 방법은 기술적으로 동일하지만 Lambda를 사용하면 일부 코드가 단순화됩니다. 먼저 String을 사용하여 List를 초기화하고 person이라고하자.
List<String> persons = new ArrayList<String>(){{add("a"); add("b"); add("c");}};
Stream<String> stream = persons.stream();
이제 다음 방법 중 하나를 사용할 수 있습니다.
Lambda Expresiion을 사용하여 정의 된 크기의 새 StringArray를 만듭니다.
String [] stringArray = stream.toArray (크기-> 새 문자열 [크기]);
메소드 참조를 직접 사용합니다.
String [] stringArray = stream.toArray (String [] :: 새);