배열 / 문자열 목록을 배열 / 정수 목록으로 변환하는 람다 표현식
Java 8에는 강력한 람다식이 함께 제공되므로
List / array of Strings를 Array / List of Integers, Floats, Doubles 등으로 변환하는 함수를 작성하고 싶습니다.
일반 Java에서는 다음과 같이 간단합니다.
for(String str : strList){
intList.add(Integer.valueOf(str));
}
그러나 문자열 배열을 정수 배열로 변환 할 때 람다를 사용하여 동일한 결과를 얻으려면 어떻게해야합니까?
에 대한 작업을 사용하여 T
유형의 목록 (배열)을 유형의 목록 (배열)으로 변환하는 도우미 메서드를 만들 수 있습니다 .U
map
stream
//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
(참조
방법 참조 )
List<Integer> intList = strList.stream()
.map(Integer::valueOf)
.collect(Collectors.toList());
수락 된 답변의 도우미 메서드는 필요하지 않습니다. 스트림 은 람다와 함께 사용하거나 일반적으로 메서드 참조를 사용하여 단축 할 수 있습니다 . 스트림은 기능적 운영을 가능하게합니다. 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 버전 도 참조하십시오 . 포크를 클릭 한 다음 실행하여 브라우저에서 실행할 수 있습니다.
EDIT: As pointed out in the comments, this is a much simpler version: Arrays.stream(stringArray).mapToInt(Integer::parseInt).toArray()
This way we can skip the whole conversion to and from a list.
I found another one line solution, but it's still pretty slow (takes about 100 times longer than a for cycle - tested on an array of 6000 0's)
String[] stringArray = ...
int[] out= Arrays.asList(stringArray).stream().map(Integer::parseInt).mapToInt(i->i).toArray();
What this does:
- Arrays.asList() converts the array to a List
- .stream converts it to a Stream (needed to perform a map)
- .map(Integer::parseInt) converts all the elements in the stream to Integers
- .mapToInt(i->i) converts all the Integers to ints (you don't have to do this if you only want Integers)
- .toArray() converts the Stream back to an array
For List :
List<Integer> intList
= stringList.stream().map(Integer::valueOf).collect(Collectors.toList());
For Array :
int[] intArray = Arrays.stream(stringArray).mapToInt(Integer::valueOf).toArray();
You can also use,
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);
I didn't find it in the previous answers, so, with Java 8 and streams:
Convert String[]
to Integer[]
:
Arrays.stream(stringArray).map(Integer::valueOf).toArray(Integer[]::new)
In addition - control when string array doesn't have elements:
Arrays.stream(from).filter(t -> (t != null)&&!("".equals(t))).map(func).toArray(generator)
Arrays.toString(int []) works for me.
'IT story' 카테고리의 다른 글
레코드 변경 내역을 추적하는 MySQL 옵션 / 기능이 있습니까? (0) | 2020.08.09 |
---|---|
std :: vector에서 std :: string을 생성하는 방법 (0) | 2020.08.09 |
Objective-C를 배우기 전에 먼저 C를 배우십시오. (0) | 2020.08.09 |
Android WebView, 브라우저를 여는 대신 앱에서 리디렉션을 처리하는 방법 (0) | 2020.08.09 |
pytest : 거의 동등하다고 주장 (0) | 2020.08.09 |