DevBoi

JAVA stream _ 심화 본문

Language/[Java]

JAVA stream _ 심화

HiSmith 2021. 9. 5. 18:01
반응형

Java Stream 심화 공부를 해보자,

 

1.list.parallelStream 의 사용 

List에 초기값이 있다고 가정하면, 해당 Stream에 List를 저렇게 병렬로, 즉 각각의 쓰레드 별로, 생성할수 있다.(Stream 객체를)

저렇게 보면, 무슨 차이지? 싶은데, 여러개 혹은 많은 량의 데이터를 생성할떄 해당 쓰레드 별로의 생성은 아주 효과적이다.

 

 

2. Unboxing, boxing의 간편을 위해서, Long,double,int에 대한 기본 Stream을 제공한다.

박싱, 언박싱이란 무엇인가?

자바의 자료형은 기본형과 참조형이 있다.

Integer과 같은건 기본형이고, int와 같은건 참조형이다.

참조형은 레퍼런스타입이고, 인터페이스와 같은 타입으로, 다양하고 활용가능하게끔 하기위해 사용되는 것들이다.

근데 그러면 왜 int를 쓰지? 그냥 Integer만 쓰면 되는거 아닌가? 싶을것이다.

우선 int 값을 Integer로 넘겨주는것을 boxing, 그 반대를 언박싱이라고한다.

1.5버전 대 이후로는 이와 같은 과정(언박싱,박싱)을 자동으로 해주는 기능이 추가되었다고 한다.

 

Integer는, 값을 가지는 객체여서, heap에 저장이된다.

하지만, 참조형 변수, 즉 래퍼클래스(객체) 가 아닌 값들은, stack에서 값을 가져오게 된다.

heap에서 불러오는 것은 스택에서 불러오는 것보다, 속도가 느리다. 따라서, 앵간하면, 굳이 사용해야할때가 아니라면?

무조건 stack에서 불러오는 기본형의 자료형을 쓰는 것이 바람직하다.

 

그러면 언제 래퍼클래스를 써야할까?

래퍼클래스는 아까도 말했듯이, 단순 자료형이 아니라 객체 이다. 부모가 object라는 뜻이다.

따라서 == 연산으로 비교가 불가능하다(해시코드를 비교하는 함수를 오버라이드하여, 재 구현하면 가능은 함)

 

래퍼클래스에는 따라서, 많은 함수들이 존재한다. 다른 자료형으로 바꿔주는 함수, 등등 래퍼클래스 내부에서 사용할수 있게 제공되는 함수들을 사용가능한 점에서 래퍼클래스를 사용하는 경우가 있다.

무튼 다시 본론으로 돌아와 서 ㅋ

 

 

이런식으로 난수도 생성.가능하다.

또한, builder방식으로 해당 Stream을 얻을수도있다.

해당 Stream을, forEach, iterator로 값을 넣고, 읽을때는 아래와 같이.사용가능하다.

 

또한, 해당 Stream을 두개, 이어서 새롭게 하나의 Stream으로 생성할수도 있다.

 

 또한 추가로, empty를 사용하거나, 빈값으로 생성할 수도 있당.

 

 

Stream에서 자수 쓰이는 메소드 filter.

fitler는 말그대로, 각각의 연산들을 filter로, 값을 세팅해서, 검사한다고 생각하면 된다.

이런 함수가 있다고 생각하면, 해당 3보다, 작은 값들은 걸러지고, 큰값들만 프린트 된다고 생각하면된다.

 

그러면 map 함수는 어떻게 사용될까?

요런식으로 사용된다.

map안에는 새로운 함수를 정의할수도있다. 예를 들어보자

이런식으로도 간단하게 사용할 수있다.

 

map의 유형중에, flatMap도 존재한다.

flatmap은 어떨때 쓰일까? 2차원 배열을 단순 한줄의 flatMap으로 하면, 한줄의 stream으로 표현이 가능하다.

 

예를들면, 이와 같다.

 

2차원 배열을 한번 Stream<String[]>으로 담고, 해당 Stream을 한번더 flatMap으로 담아서, 한줄의 Stream으로 담을수 있다.

이렇게 되면, 2차원 배열을 별다른 어려운 수식없이, filter가 가능하게 된다.

 

추가로, distinct연산도 있다. 이것도 꽤 유용하게 쓰일 것같다.

 

또한 sorted 함수가있다.

단 주의 점은, String 같은 참조형은 그냥 사용이 가능하지만, 래퍼클래스를 사용하는 기본형의 경우에는

박싱을 해야한다.

 

limit로, 개수 제한하기

collect를 사용하면, 각 연산된 것들을 다시 형변환 및 수집이 가능하다.

해당 심화하는 내용은 다음 포스팅에 진행해야겠다.

 

또한 하나의 봐야하는 내용중, skip이라는 함수도 있다.

해당 skip을 사용하면, 처음인자부터, 전달된 숫자만큼의 인자를 생략하고 연산 및 함수가 수행된다.

 

예를 들면, 처음에 2개의인수를 제끼고, List에 담고싶은 경우,

해당 skip함수와, collect함수를 쓴다면 잘  새로운 list 배열로 담기게된다.

 

 

반응형

'Language > [Java]' 카테고리의 다른 글

[Java] 제네릭의 이해  (0) 2022.02.17
Java 리플렉션 이란?  (0) 2021.12.06
JAVA stream 사용 예제_1  (0) 2021.09.02
Java Garbage Collection 이란?  (0) 2021.07.21
Optional 변수 예제 및 사용방법  (0) 2021.07.07