일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- mybatis
- Spring
- 소켓
- Set
- IntelliJ
- Java
- tomcat
- gradle
- AOP
- STREAM
- Linux
- map
- 액세스회선
- 허브
- DevOps
- 캐시서버
- container
- 방화벽
- JPA
- sonarQube
- 라우터
- Pipeline
- docker
- cloud
- Jenkins
- post
- Collection
- jdk
- ansible
- LAN어댑터
- Today
- Total
거북이-https://velog.io/@violet_evgadn 이전완료
Stream을 활용한 Collection to Array & Array to Collection 본문
Stream을 활용한 Collection to Array & Array to Collection
VioletEvgadn 2022. 12. 30. 15:33코딩 테스트 시 필요한 이유
모든 코딩 테스트를 보면 왜인지는 모르겠지만 답을 배열(int[], String[] 등)로 반환하라고 하는 경우가 많다.
하지만 개인적으로는 선언 시 미리 Size를 정해줘야 하는 배열보다는 Size 걱정 없이 데이터를 저장할 수 있는 Collection을 더 많이 활용하게 된다.
물론 Collection을 for문이나 for each문을 통해 모든 데이터를 순회하며 배열에 값을 넣어줘도 될 것이다.
(실제로 필자는 예전에 이런 방식으로 배열을 만들었다)
하지만 Stream을 사용한다면 데이터 순회에 걸리는 실행 시간을 조금이라도 줄일 수 있지 않을까 생각하여 정리해 보았다.
Collection to Array
◎ int가 아닌 Data Type → int
- String s : Integer.parseInt(String s)
- Long l : l.intValue()
- Double d : d.intValue()
- long l : (int) l
- double d : (int) d
- Integer i : (int) i or i.intValue()
◎ Collection to int Array
// String Collection to int Array
List<String> sList = new ArrayList<>();
int[] sArr = sList.stream().mapToInt(i->Integer.parseInt(i)).toArray(); // 람다식
int[] sArr2 = sList.stream().mapToInt(Integer::parseInt).toArray(); // 메서드 레퍼런스
// Long Collection to int Array
List<Long> lList = new ArrayList<>();
int[] lArr = lList.stream().mapToInt(i->i.intValue()).toArray(); // 람다식
int[] lArr2 = lList.stream().mapToInt(Long::intValue).toArray(); // 메서드 레퍼런스
// Integer Collection to int Array
List<Integer> iList = new ArrayList<>();
int[] iArr = iList.stream().mapToInt(i->i).toArray(); // 람다식
int[] iArr2 = iList.stream().mapToInt(Integer::intValue).toArray(); // 메서드 레퍼런스
// Double Collection to int Array
List<Double> dList = new ArrayList<>();
int[] dArr = dList.stream().mapToInt(i->i.intValue()).toArray(); // 람다식
int[] dArr2 = dList.stream().mapToInt(Double::intValue).toArray(); // 메서드 레퍼런스
// long Array to int Array
long[] longArr = new long[10];;
int[] intArr = Arrays.stream(longArr).mapToInt(l -> (int) l).toArray();
위 코드에서 "mapToInt" 메서드의 Parameter로써 위에서 설명한 Data Type별 int 형 데이터 변환 방법을 주입한 것을 볼 수 있다.
long[]은 mapToLong, double[]은 mapToLong을 대신 사용할 뿐 방법은 동일하므로 long[]과 double[]에 대해선 따로 기입하지 않겠다.
Array to Collection
◎ int → 다른 Data Type
- String s : Integer.toString(s)
- Long : Long.valueOf(s)
- Double : Double.valueOf(d)
Collection은 Wrapper Class나 Reference Class만 T로 주입할 수 있으므로 위 3개만 알고 있으면 된다.
◎ int Array to Collection<T>
int[] intArr = new int[10];
// Integer Collection으로 치환
List<Integer> intList = Arrays.stream(intArr).boxed().collect(Collectors.toList());
// Long Collection으로 치환
Set<Long> longSet1 = Arrays.stream(intArr).mapToObj(i->Long.valueOf(i)).collect(Collectors.toSet()); // 람다식
Set<Long> longSet2 = Arrays.stream(intArr).mapToObj(Long::valueOf).collect(Collectors.toSet()); // 메서드 레퍼런스
// Double Collection으로 치환
List<Double> doubleList = Arrays.stream(intArr).mapToObj(i->Double.valueOf(i)).collect(Collectors.toList()); // 람다식
List<Double> doubleList2 = Arrays.stream(intArr).mapToObj(Double::valueOf).collect(Collectors.toList()); // 메서드 레퍼런스
// HashSet(Collection 중 특정 클래스)으로 치환
HashSet<Integer> hashSet = Arrays.stream(intArr).boxed().collect(Collectors.toCollection(HashSet::new));
mapToLong은 Wrapper Class인 "Long"이 아닌 Primitive 자료형 "long"으로 변환하기 위한 메서드이다.
따라서 Collection<T>에서 T로 들어갈 수 있는 Class 형태로 만들기 위해선 mapToObj를 활용해야 한다.
추가로 IntStream을 Stream<Integer>로 변경하기 위해선 boxed()를 사용하면 된다는 것을 배웠으므로 Long<Integer> 같은 경우에는 boxed() 메서드를 활용하면 된다.
마지막으로 Set<T>나 List<T>가 아닌 HashSet, ArrayList같이 Collection Class를 상세히 설정하고 싶을 때 Collectors.toCollection을 사용하면 된다.
long[], double[] 또한 비슷한 방법을 사용하면 되므로 따로 기입하지 않겠다.
'코딩 테스트 시 알면 좋은 것들' 카테고리의 다른 글
문자열 뒤집기 (0) | 2023.01.03 |
---|---|
Compare 관련 메소드 (0) | 2022.12.31 |
log & 거듭제곱 (0) | 2022.12.30 |
N 진법 (0) | 2022.12.30 |
Long & Int 범위 (0) | 2022.12.30 |