배열/문자열 목록을 배열/정수 목록으로 변환하는 람다 식
자바8에는 강력한 람다 표현이 포함되어 있기 때문에
문자열 목록/배열을 배열/정수 목록, 플로트 목록, 더블 목록 등으로 변환하는 함수를 쓰고 싶습니다.
일반 Java에서는 다음과 같이 단순합니다.
for(String str : strList){
intList.add(Integer.valueOf(str));
}
그러나 문자열 배열을 정수 배열로 변환할 경우 람다에서 동일한 값을 얻으려면 어떻게 해야 합니까?
List<Integer> intList = strList.stream()
.map(Integer::valueOf)
.collect(Collectors.toList());
유형의 목록(배열)을 변환하는 도우미 메서드를 생성할 수 있습니다.T
활자 일람표(배열)로U
의 조작을 사용합니다.
//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);
Note that
s -> Integer.parseInt(s)
could be replaced with
Integer::parseInt
(see
메서드 레퍼런스)
승인된 답변의 도우미 메서드는 필요하지 않습니다.스트림은 람다와 함께 사용하거나 보통 메서드 참조를 사용하여 단축할 수 있습니다.스트림은 기능 동작을 가능하게 합니다. map()
요소를 변환하고collect(...)
또는toArray()
스트림을 배열 또는 수집으로 다시 감습니다.
벤캣 서브라마니암의 토크(동영상)가 나보다 더 잘 설명해준다.
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());
2 변환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 버전도 참조해 주세요.Fork를 클릭한 후 브라우저에서 실행할 수 있습니다.
편집: 코멘트에서 지적한 바와 같이, 이것은 매우 심플한 버전입니다.Arrays.stream(stringArray).mapToInt(Integer::parseInt).toArray()
이렇게 하면 목록으로의 변환 전체를 건너뛸 수 있습니다.
다른 한 줄의 솔루션을 찾았지만 여전히 매우 느립니다(6,000 0의 어레이로 테스트된 사이클의 약 100배 소요).
String[] stringArray = ...
int[] out= Arrays.asList(stringArray).stream().map(Integer::parseInt).mapToInt(i->i).toArray();
기능:
- Arrays.asList()는 어레이를 목록으로 변환합니다.
- .stream은 그것을 스트림으로 변환합니다(맵 실행에 필요)
- .map(Integer:: parseInt)은 스트림의 모든 요소를 정수로 변환합니다.
- .mapToInt(i->i)는 모든 정수를 ints로 변환합니다(정수만 원하는 경우 이 작업을 수행할 필요가 없습니다).
- .toArray()는 스트림을 어레이로 변환합니다.
리스트의 경우:
List<Integer> intList
= stringList.stream().map(Integer::valueOf).collect(Collectors.toList());
어레이의 경우:
int[] intArray = Arrays.stream(stringArray).mapToInt(Integer::valueOf).toArray();
사용할 수도 있습니다.
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);
이전 답변에서는 찾을 수 없었습니다.Java 8과 스트림에서는 다음과 같이 되어 있습니다.
변환String[]
로.Integer[]
:
Arrays.stream(stringArray).map(Integer::valueOf).toArray(Integer[]::new)
문자열을 정수로 변환하기 위해 람다 연산과 함께 maptoInt()를 사용했습니다.
int[] arr = Arrays.stream(stringArray).mapToInt(item -> Integer.parseInt(item)).toArray();
또한 문자열 배열에 요소가 없는 경우를 제어합니다.
Arrays.stream(from).filter(t -> (t != null)&&!("".equals(t))).map(func).toArray(generator)
Arrays.toString(int [])이 적합합니다.
언급URL : https://stackoverflow.com/questions/23057549/lambda-expression-to-convert-array-list-of-string-to-array-list-of-integers
'programing' 카테고리의 다른 글
mysql/퍼지 검색을 위한 Levenshtein 거리 구현? (0) | 2022.09.22 |
---|---|
Vue.js 서드파티 스크립트에서 사용할 컴포넌트 데이터 속성을 표시하는 방법 (0) | 2022.09.22 |
여러 클래스가 있는 요소를 가져오는 방법 (0) | 2022.09.18 |
MySQL: INT를 DATETIME으로 변환 (0) | 2022.09.18 |
JABORK에서 Java를 9에서8로 다운그레이드 하는 방법이클립스는 Java 9에서 실행되고 있지 않습니다. (0) | 2022.09.18 |