배열 / 문자열 목록을 배열 / 정수 목록으로 변환하는 람다 표현식


111

Java 8에는 강력한 람다식이 함께 제공되므로

List / array of Strings를 Array / List of Integers, Floats, Doubles 등으로 변환하는 함수를 작성하고 싶습니다.

일반 Java에서는 다음과 같이 간단합니다.

for(String str : strList){
   intList.add(Integer.valueOf(str));
}

그러나 문자열 배열을 정수 배열로 변환 할 때 람다를 사용하여 동일한 결과를 얻으려면 어떻게해야합니까?

답변:


128

의 작업을 사용하여 T유형의 목록 (배열)을 유형의 목록 (배열)으로 변환하는 도우미 메서드를 만들 수 있습니다 .Umapstream

//for lists
public static <T, U> List<U> convertList(List<T> from, Function<T, U> func) {
    return from.stream().map(func).collect(Collectors.toList());
}

//for arrays
public static <T, U> U[] convertArray(T[] from, 
                                      Function<T, U> func, 
                                      IntFunction<U[]> generator) {
    return Arrays.stream(from).map(func).toArray(generator);
}

다음과 같이 사용하십시오.

//for lists
List<String> stringList = Arrays.asList("1","2","3");
List<Integer> integerList = convertList(stringList, s -> Integer.parseInt(s));

//for arrays
String[] stringArr = {"1","2","3"};
Double[] doubleArr = convertArray(stringArr, Double::parseDouble, Double[]::new);


참고 s -> Integer.parseInt(s)로 대체 될 수는 Integer::parseInt(참조 방법 참조 )


5
Guava를 사용하는 경우 Lists.transform().
Alexandros

아주 좋은 예입니다. 이 기능은 코드를 더 다양하고 강력하게 만듭니다. Thks !!!
Marcelo Rebouças

127
List<Integer> intList = strList.stream()
                               .map(Integer::valueOf)
                               .collect(Collectors.toList());

5
조금 설명해 주 시겠어요?
Unheilig 2014-10-20

1
이것은 String 목록을 스트림으로 변환 한 다음 목록의 모든 요소를 ​​Integer로 매핑 / 변환 한 다음 목록으로 수집하는 것입니다.
hemanto dec

5
람다의 요점 (원래 질문은 람다 식을 요청 함)이 새 함수를 정의하지 않는 것이므로 이것은 허용되는 대답이어야합니다. 위에있는,이 답변은 우아하게 기존의 정수 :: 위해 valueOf 함수를 사용하여
조나단 벤

31

수락 된 답변의 도우미 메서드는 필요하지 않습니다. 스트림 은 람다와 함께 사용하거나 일반적으로 메서드 참조를 사용하여 단축 할 수 있습니다 . 스트림은 기능적 운영을 가능하게합니다. map()요소를 변환 collect(...)하거나 toArray()스트림을 다시 배열 또는 컬렉션으로 래핑합니다.

Venkat Subramaniam의 강연 (비디오) 이 저보다 더 잘 설명합니다.

1 개 변환 List<String>List<Integer>

List<String> l1 = Arrays.asList("1", "2", "3");
List<Integer> r1 = l1.stream().map(Integer::parseInt).collect(Collectors.toList());

// the longer full lambda version:
List<Integer> r1 = l1.stream().map(s -> Integer.parseInt(s)).collect(Collectors.toList());

이 변환 List<String>int[]

int[] r2 = l1.stream().mapToInt(Integer::parseInt).toArray();

3 변환 String[]List<Integer>

String[] a1 = {"4", "5", "6"};
List<Integer> r3 = Stream.of(a1).map(Integer::parseInt).collect(Collectors.toList());

4 변환 String[]int[]

int[] r4 = Stream.of(a1).mapToInt(Integer::parseInt).toArray();

5 변환 String[]List<Double>

List<Double> r5 = Stream.of(a1).map(Double::parseDouble).collect(Collectors.toList());

6 (보너스) 변환 int[]String[]

int[] a2 = {7, 8, 9};
String[] r6 = Arrays.stream(a2).mapToObj(Integer::toString).toArray(String[]::new);

물론 더 많은 변형이 가능합니다.

이 예제의 Ideone 버전 도 참조하십시오 . 포크를 클릭 한 다음 실행하여 브라우저에서 실행할 수 있습니다.


7

편집 : 주석에서 지적했듯이 Arrays.stream(stringArray).mapToInt(Integer::parseInt).toArray() 이것은 훨씬 더 간단한 버전입니다. 이렇게하면 목록에서 전체 변환을 건너 뛸 수 있습니다.


다른 한 줄 솔루션을 찾았지만 여전히 매우 느립니다 (for 사이클보다 약 100 배 더 오래 걸립니다-6000 0의 배열에서 테스트 됨).

String[] stringArray = ...
int[] out= Arrays.asList(stringArray).stream().map(Integer::parseInt).mapToInt(i->i).toArray();

이것이하는 일 :

  1. Arrays.asList ()는 배열을 List로 변환합니다.
  2. .stream은이를 Stream으로 변환합니다 (지도를 수행하는 데 필요함).
  3. .map (Integer :: parseInt)는 스트림의 모든 요소를 ​​정수로 변환합니다.
  4. .mapToInt (i-> i)는 모든 정수를 정수로 변환합니다 (정수만 원하는 경우에는이 작업을 수행 할 필요가 없습니다).
  5. .toArray ()는 Stream을 배열로 다시 변환합니다.

13
1 단계와 4 단계는 필요하지 않습니다.Arrays.stream(stringArray).mapToInt(Integer::parseInt).toArray()
xehpuk

3

목록 :

List<Integer> intList 
 = stringList.stream().map(Integer::valueOf).collect(Collectors.toList());

어레이의 경우 :

int[] intArray = Arrays.stream(stringArray).mapToInt(Integer::valueOf).toArray();

2

당신은 또한 사용할 수 있습니다,

List<String> list = new ArrayList<>();
    list.add("1");
    list.add("2");
    list.add("3");

    Integer[] array = list.stream()
        .map( v -> Integer.valueOf(v))
        .toArray(Integer[]::new);

0

이전 답변에서 찾지 못 했으므로 Java 8 및 스트림을 사용하면 다음과 같습니다.

변환 String[]합니다 Integer[]:

Arrays.stream(stringArray).map(Integer::valueOf).toArray(Integer[]::new)

-1

또한 문자열 배열에 요소가없는 경우 제어 :

Arrays.stream(from).filter(t -> (t != null)&&!("".equals(t))).map(func).toArray(generator) 

-1

문자열을 정수로 변환하기 위해 Lambda 작업과 함께 maptoInt ()를 사용했습니다.

int[] arr = Arrays.stream(stringArray).mapToInt(item -> Integer.parseInt(item)).toArray();

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