본문 바로가기
Lang/Java

[java] Stream 정의, 기본 함수, 파이프라인

by 상똥 2023. 7. 25.

[1. Stream이란]

- Stream은 데이터 집합체(흐름)를 쉽게 구성할 수 있도록 제작된 클래스이다. 

- Stream의 lambda 함수를사용할 경우 데이터를 더 쉽고 편리하게 정제할 수 있으며(데이터 필터링, 중복제거, 정렬 등) 코드도 더 보기쉽게 짤 수 있다.

- 여러가지 필터링 메서드를 한번에 구성해서 여러가지 조건으로 정제된 데이터를 출력할 수 있다. (스트림 내의 데이터가 변하는 것은 아님)

 

[2. Stream 생성]

방법 1. Stream<데이터 타입> 스트림명 = Stream.of(객체1, 객체2, 객체3, ··· )

- 원하는 데이터를 마음대로 삽입하여 생성

Stream<Integer> example1 = Stream.of(1, 2, 3, 4, 5);

 

방법 2. Stream<데이터 타입> 스트림명 = Stream.generate(Supplier<데이터 타입> obj)

- 데이터를 규칙에 맞게 삽입하여 생성

Stream<Double> example2 = Stream.generate(Math::random);

 

방법 3. Stream<데이터 타입> 스트림명 = Stream.concat(스트림1, 스트림2)

- 두 가지 스트림을 결합하는 방법

Stream<Integer> stream1 = Stream.of(1, 2, 3);
Stream<Integer> stream1 = Stream.of(4, 5, 6);

Stream<Integer> result = Stream.concat(stream1, stream2); //1, 2, 3, 4, 5, 6

 

[3. 데이터 필터링]

(1) filter : Stream<데이터타입> 결과 스트림명 = 정제할 스트림명.filter(조건)

- 스트림 내의 데이터를 조건에 맞게 정제하여 복사

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);

Stream<Integer> result1 = stream.filter(x -> (x > 3));	//4, 5
Stream<Integer> result12 = stream.filter(x -> (x < 3));	//1, 2

 

(2) distinct : Stream<데이터타입> 결과 스트림명 = 정제할 스트림명.distinct()

- 스트림 내의 데이터 중복을 제거한 후 복사

Stream<String> stream = Stream.of("A", "B", "A", "C", "C", "B");

Stream<String> result = stream.distinct();	//A, B, C

 

(3) sorted : Stream<데이터타입> 결과 스트림명 = 정렬할 스트림명.sorted((o1, o2) -> o1 - o2)

- 스트림 내의 데이터를 조건에 맞게 정렬

Stream<Integer> stream = Stream.of(4, 2, 5, 1, 3);

Stream<Integer> desc = stream.sorted((i1, i2) -> i2 - i1); // 5, 4, 3, 2, 1
Stream<Integer> asc = stream.sorted((i1, i2) -> i1 - i2); // 1, 2, 3, 4, 5

(4) limit : Stream<데이터타입> 결과 스트림명 = 제한할 스트림명.limit(앞에서부터 출력할 개수)

Stream<String> stream = Stream.of("J", "A", "V", "A", "S", "C", "R", "I", "P", "T");

Stream<String> result = stream.limit(4); //J, A, V, A

(5) skip : Stream<데이터타입> 결과 스트림명 = 제한할 스트림명.skip(앞에서부터 생략할 개수)

Stream<String> stream = Stream.of("J", "A", "V", "A", "S", "C", "R", "I", "P", "T");

Stream<String> result = stream.skip(4); //S, C, R, I, P, T

(6) collect : Stream<데이터타입> 결과 스트림명 = 다른 형태로 바꿀 스트림명.collect(Collectors.to~)

 

 

[4. 파이프라인]

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        Stream<Integer> example = Stream.of(4, 4, 1, -1, -3, 2, -5, 0, 0, -2, -4, 5, 3);

        final List<Integer> result = example
                .distinct()                     //4, 1, -1, -3, 2, -5, 0, -2, -4, 5, 3
                .sorted((i1, i2) -> i1 - i2)    //-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5
                .filter(x -> (x > 0))           //1, 2, 3, 4, 5
                .limit(3)               //1, 2, 3
                .collect(Collectors.toList());

        result.forEach(System.out::print);
    }
}