람다와 스트림

Jaca·2021년 10월 15일
0

람다식

람다식은 간단히 말해서 메서드를 하나의 식으로 표현한 것이다.
람다식은 함수를 간략하면서도 명확한 식으로 표현할 수 있게 해준다.
메서드를 람다식으로 표현하면 메서드의 이름과 반환값이 없어지므로,
일명 '익명 함수' 라고도 한다.

간단한 예시를 보자

int[] arr = new int[5];
Arrays.setAll(arr, (i) -> (int)(Math.random()*5)+1);
==>
int method() {
    return (int)(Math.random()*5) + 1;
}

위의 문장이 바로 람다식이다.
아래의 method()와 같은 역할을 한다.

모든 메서드는 클래스에 포함되어야 하므로 클래스도 새로 만들어야 하고, 객체도 생성해야하만 비로소 이 메서드를 호출할 수 있다.
그러나 람다식은 이 과정을 람다식 자체만으로도 이 메서드의 역할을 대신할 수 있다.
람다식의 장점은 간결하면서도 이해하기 쉽다는 것이다.

람다식 작성하기

람다식은 '익명 함수' 답게 메서드에서 이름과 반환타입을 제거하고 매개변수 선언부와 몸통 {} 사이에 '->'를 추가한다.

반환타입 메서드이름 (매개변수 선언) {
      ...
}
==>

(매개변수 선언) -> { ... }

예를 들어 메서드 max를 람다식으로 변환하면 아래와 같아진다.

(int a, int b) -> { return a > b ? a : b; }

반환 값이 있는 메서드의 경우, return문 대신 '식'으로 대신 할 수 있다.
식의 연산결과가 자동적으로 반환값이 된다.

(int a, int b) -> a > b ? a : b

람다식에 선언된 매개변수의 타입은 추론이 가능한 경우는 생략할 수 있는데,
대부분의 경우 생략이 가능하다.
람다식에 반환 타입이 없는 이유도 항상 추론이 가능하기 때문이다.

스트림

스트림은 데이터 소스를 추상화하고, 데이터를 다루는데 자주 사용되는 메서드를 정의해 놓은 것이다.
데이터 소스를 추상화하였다는 것은, 데이터 소스가 무엇이던 간에 같은 방식으로 다룰 수 있게 되었다는 것과 코드의 재사용성이 높아진다는 것을 의미한다.

스트림의 특징

  • 스트림은 데이터 소스를 변경하지 않는다.
    스트림은 데이터 소스를 읽기만할 뿐, 데이터 소스를 변경하지 않는다.
    필요하다면, 결과를 컬렉션이나 배열에 담아서 반환할 수 있다.

  • 스트림은 일회용이다.
    스트림은 Iterator처럼 일회용이다.
    스트림은 한번 사용하면 닫혀서 다시 사용할 수 없다.
    필요하다면 새로 생성해야한다.

  • 스트림은 작업을 내부 반복으로 처리한다.
    스트림을 이용한 작업이 간결할 수 있는 비결중 하나가 내부 반복 이다.
    반복문을 메서드의 내부에 숨길 수 있다는 것을 의미한다.

  • 지연된 연산
    스트림 연산에서 중요한 점은 최종 연산이 수행되기 전까지 중간 연산이 수행되지 않는다는 것이다.
    최종 연산이 수행되어야 비로소 중간 연산을 거쳐 최종 연산에서 소모된다.

  • 병렬 스트림
    스트림으로 데이터를 다룰 때의 장점 중 하나가 바로 병렬 처리가 쉽다는 것이다.
    병렬 스트림으로 처리를 원하면 parallel() 을 호출하면 된다.

profile
I am me

0개의 댓글