가자미의 개발이야기

자바 스트림의 기초 본문

Java/자바 기본 문법

자바 스트림의 기초

가자미 2021. 2. 9. 11:13

스트림이란 데이터를 일렬로 정렬한 상태를 의미한다.

이렇게 정렬된 데이터를 파이프에 통과시켜 우리가 원하는 결과를 얻고자 할 때 쓰인다.

 

이때 파이프는 중간연산과 최종연산으로 나뉘는데,

최종연산은 마지막에 오는 파이프로, 다른 것과 순서가 바뀔 수 없고,

중간연산은 최종연산을 제외한 모든 파이프를 의미한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.Arrays;
import java.util.stream.IntStream;
 
public class StreamPtc {
    public static void main(String[] args) {
        int[] ar = {1,2,3,4,5};
        
        //학습용 코드(실효성 x)
        IntStream stm1 = Arrays.stream(ar);
        IntStream stm2 = stm1.filter(n->n%2==1);
        int sum= stm2.sum();
        System.out.println(sum);
        
        //실제 사용되는 예시코드
        int sum2 = Arrays.stream(ar).filter(n->n%2==1).sum();
        System.out.println(sum2);
    }
}
c

 

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.Arrays;
import java.util.stream.IntStream;
 
public class StreamPtc {
    public static void main(String[] args) {
        double[] ds = {1.12.23.34.4};
        
        Arrays.stream(ds).forEach(d->System.out.print(d+"\t"));
        System.out.println();
        
        Arrays.stream(ds,1,4).forEach(d->System.out.print(d+"\t"));
    }
}
cs

-콜렉션 인스턴스에서 스트림 생성하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.util.Arrays;
import java.util.List;
import java.util.stream.IntStream;
 
public class StreamPtc {
    public static void main(String[] args) {
        //default Stream<E> stream() 
        //ava.util.Collection<E>의 디폴트 메소드
        
        List<String> list = Arrays.asList("Toy""Robot","Box");
        list.stream().forEach(s->System.out.print(s+"\t"));
        System.out.println();
    }
}
cs

-Maping

1
2
3
4
5
6
7
8
9
10
11
import java.util.Arrays;
import java.util.List;
import java.util.stream.IntStream;
 
public class StreamPtc {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("Toy""Robot","Box");
        list.stream().map(s->s.length()).forEach(s->System.out.print(s+"\t"));
        System.out.println();
    }
}
cs

-이렇게 될 경우 map은 String을 받아 int를 반환해야하지만, int는 제네릭에 사용 될 수 없어서 Integer가 반환된다.

-결국 오토박싱, 오토언박싱이 진행된다.

--이런 상황이 불편하면 mapToInt, mapToDouble, mapToLong을 사용하는 것이 좋다.

 

-리덕션 : 어떤 조건하에 다수의 데이터를 줄이는 연산. ex) sum();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
import java.util.function.*;
 
public class StreamPtc {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("Toy""Robot","Box");
        
        BinaryOperator<String> lc =(s1,s2)->{
            if(s1.length() > s2.length())
                return s1;
            else
                return s2;
        };//람다식 만들기
        
        //최종연산 reduce
        String str = list.stream().reduce("", lc);
        System.out.println(str);
    }
}
cs

-병렬 스트림

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
import java.util.function.*;
 
public class StreamPtc {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("Toy""Robot","Box");
        
        BinaryOperator<String> lc =(s1,s2)->{
            if(s1.length() > s2.length())
                return s1;
            else
                return s2;
        };//람다식 만들기
        
        //최종연산 reduce
        String str = list.parallelStream()//병렬 스트림 생성
                .reduce("", lc);
        System.out.println(str);
    }
}
cs

병렬스트림 생성하고 나면 자연스럽게 스트림이 병렬로 진행된다.