본문 바로가기

Java 문법

람다, 스트림

람다식(Lambda expression)이란?

- 식별자 없이 실행 가능한 함수

- 함수의 이름을 따로 정의하지 않아도 곧바로 함수처럼 사용할 수 있음

- 문법이 간결하여 보다 편리함

- 익명 함수

 

※ 람다식이 코드를 보다 간결하게 만들어주지만, 무조건 좋은 것은 아님

- 람다를 사용하여 만든 익명 함수는 재사용 불가

- 람다만을 사용할 경우, 비슷한 메소드를 중복되게 생성할 가능성이 있음

 

[기존의 메소드 형식]
반환타입 메소드이름(매개변수 선언) {
수행 코드 블록
}
[람다식의 형식]
반환타입 메소드이름(매개변수 선언) -> {
수행 코드 블록
}
 public static void main(String[] args) {
        String[] s = {"Korea", "USA", "Japan", "China"};
        ArrayList<String> list = new ArrayList<>(Arrays.asList(s));
        Stream<String> stream = list.stream();
        stream.map(String::toUpperCase)
                .forEach(System.out::println);
        /*
        같은 코드        
        stream.map(str->str.toUpperCase())
                .forEach(x-> System.out.println(x));
         */
        
        /*
        KOREA
        USA
        JAPAN
        CHINA
         */
    }

- ::(이중 콜론 연산자)

- 매개변수를 중복해서 사용하고 싶지 않을 때 사용

 

 

스트림이란?

- 람다를 활용할 수 있는 기술 중 하나

- "데이터의 흐름"

- 컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자

- 스트림을 활용해서 필터링, 데이터 변경, 다른 타입이나 자료구조로 변환 가능

 

 

스트림의 특징

- 데이터 소스 변경 X

- 작업을 내부적으로 반복 처리

- 컬렉션의 요소를 모두 읽고 나면 닫혀서 재사용 불가

- 필요할 경우 재생성 필요

 

 

스트림 구조

1. 스트림 생성

- Stream<T> Collection.stream()을 이용하여 해당 컬렉션을 기반으로하는 스트림 생성

 

2. 중간 연산

- 데이터의 형변환 혹은 필터링, 정렬 등 스트림에 대한 가공

- map(변환), sorted(정렬), skip(스트림 자르기), limit(스트림 자르기) 등등

 

3. 최종 연산

- 스트림의 요소를 소모해서 결과 반환

- 최종 연산 이후 스트팀이 닫혀 재사용 불가

- 최종 연산의 결과값은 단일 값일 수도 있고 배열 혹은 컬렉션 일 수 있음

- collect()를 이용해서 다른 컬렉션으로 변경 혹은 reduce를 이용해서 incremental calculation하는 것도 많이 사용됨

 

기본 구조

public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Korea");
        list.add("USA");
        list.add("Japan");
        list.add("China");
        System.out.println(list); //[Korea, USA, Japan, China]

        List<String> result =
                list.stream() //스트림 생성
                .limit(2) //중간 연산
                .collect(Collectors.toList()); //최종 연산
        System.out.println(result); //[Korea, USA]

        Set<String> set =
                list.stream() //스트림 생성
                .filter("Korea"::equals) //중간 연산
                .collect(Collectors.toSet()); //최종 연산
        set.forEach(System.out::println); //Korea
    }

 

Array -> Stream

public static void main(String[] args) {
        String[] array = {"Korea", "USA", "Japan", "China"};
        Stream<String> stringStream = Arrays.stream(array);
        stringStream.forEach(x -> System.out.println("나라 이름 : " + x));

        System.out.println();
        Arrays.stream(array).forEach(x -> System.out.println("나라 이름 : " + x));
    }

 

reduce 활용

public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        
        //1~10 합
        Integer result = list.stream().reduce(0, Integer::sum);
        System.out.println(result);
    }

'Java 문법' 카테고리의 다른 글

컬렉션  (0) 2021.08.15