개발놀이터

람다식과 Stream API 본문

Java

람다식과 Stream API

마늘냄새폴폴 2022. 8. 4. 11:02

람다함수란?

람다 함수는 프로그래밍 언어에서 사용되는 개념으로 익명 함수를 지칭하는 용어이다. 현재 사용되고 있는 람다의 근간은 수학과 기초 컴퓨터과학 분야에서의 람다 대수이다. 람다 대수는 간단히 말하자면 수학에서 사용하는 함수를 보다 단순하게 표현하는 방법이다.

 

람다의 장단점

장점

  • 코드의 간결성 - 람다를 사용하면 불필요한 반복문의 삭제가 가능하며 복잡한 식을 단순하게 표현할 수 있다.
  • 지연연산 수행 - 람다는 지연연산을 수행함으로써 불필요한 연산을 최소화 할 수 있다.
  • 병렬처리 가능 - 멀티스레드를 활용하여 병렬처리를 사용할 수 있다.

단점

  • 람다식의 호출이 까다롭다. (어렵다)
  • 람다 Stream 사용 시 단순 for문 혹은 while문보다 성능이 떨어진다.
  • 불필요하게 너무 사용하게 되면 오히려 가독성을 떨어뜨릴 수 있다.

 

람다의 표현식

 

//정상적인 유형
() -> {}
() -> 1
() -> { return 1; }

(int x) -> x+1
(x) -> x+1
x -> x+1
(int x) -> { return x+1; }
x -> { return x+1; }

(int x, int y) -> x+y
(x, y) -> x+y
(x, y) -> { return x+y; }

(String lam) -> lam.length()
lam -> lam.length()
(Thread lamT) -> { lamT.start(); }
lamT -> { lamT.start(); }


//잘못된 유형 선언된 type과 선언되지 않은 type을 같이 사용 할 수 없다.
(x, int y) -> x+y
(x, final y) -> x+y

 

 

람다식 예제

기존 자바 문법

new Thread(new Runnable() {
   @Override
   public void run() { 
      System.out.println("Welcome Heejin blog"); 
   }
}).start();

람다식 문법

new Thread(()->{
      System.out.println("Welcome Heejin blog");
}).start();

 

 

함수형 인터페이스

@FunctionalInterface

Funtional Interface는 일반적으로 '구현해야할 추상 메서드가 하나만 정의된 인터페이스'를 가리킨다. 자바 컴파일러는 이렇게 명시된 함수형 인터페이스에 두 개 이상의 메서드가 선언되면 오류를 발생시킨다.

 

//구현해야 할 메소드가 한개이므로 Functional Interface이다.
@FunctionalInterface
public interface Math {
    public int Calc(int first, int second);
}

//구현해야 할 메소드가 두개이므로 Functional Interface가 아니다. (오류 사항)
@FunctionalInterface
public interface Math {
    public int Calc(int first, int second);
    public int Calc2(int first, int second);
}

 

함수형 인터페이스 람다 사용 예제

함수형 인터페이스 선언

@FunctionalInterface
interface Math {
    public int Calc(int first, int second);
}

 

추상 메서드 구현 및 함수형 인터페이스 사용

public static void main(String[] args){

   Math plusLambda = (first, second) -> first + second;
   System.out.println(plusLambda.Calc(4, 2));

   Math minusLambda = (first, second) -> first - second;
   System.out.println(minusLambda.Calc(4, 2));

}

 

cf) 함수형 인터페이스가 하나의 추상메서드만 가진 인터페이스에 한해서 작동하는 이유는 자바가 다중상속을 지원하지 않는 것과 같은 맥락일 것으로 추측된다. 즉, 함수형 인터페이스를 람다로 구현할 때 어떤 추상 메서드를 사용하는지 모르기 때문에 하나만 선언할 수 있는 것 같다.

 

 

 

Stream API

Stream이란 다양한 데이터를 표준화된 방법으로 다루기 위한 라이ㅏ브러리이다. 자바8부터 추가된 Stream API는 다음과 같이 구성된다.

example.stream().filter(x -> x < 2).count

stream() : 스트림 생성

filter : 중간 연산 (연속해서 수행 가능)

count : 최종 연산 (마지막에 단 한번만 사용 가능)

 

Stream의 특징

  • Stream은 데이터를 변경하지 않는다.
  • 1회용이다.
  • 지연 연산을 수행한다.
  • 병렬 실행이 가능하다.

 

Stream의 종류

 

Stream의 중간 연산 명령어

Stream의 최종 연산 명령어

 

  Collector 연산

 

Reference

https://khj93.tistory.com/entry/JAVA-%EB%9E%8C%EB%8B%A4%EC%8B%9DRambda%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EA%B3%A0-%EC%82%AC%EC%9A%A9%EB%B2%95

 

[JAVA] 람다식(Lambda)의 개념 및 사용법

람다함수란? 람다 함수는 프로그래밍 언어에서 사용되는 개념으로 익명 함수(Anonymous functions)를 지칭하는 용어입니다. 현재 사용되고 있는 람다의 근간은 수학과 기초 컴퓨터과학 분야에서의 

khj93.tistory.com

 

'Java' 카테고리의 다른 글

try-with-resouce  (0) 2022.08.04
Optional  (0) 2022.08.04
CheckedException, UncheckedException  (0) 2022.08.04
String, StringBuilder, StringBuffer  (0) 2022.08.03
GC (Garbage Collection)  (0) 2022.08.01