JAVA

[ JAVA ] - 람다식이란?

algml0703 2023. 10. 19. 23:19
반응형

람다식이란?

Java 8부터 추가된 기능인 람다식은 메서드를 익명함수로 정의할 수 있게 해줍니다. 람다식은 코드를 간결화하고, 객체지향언어인 자바를 통해서 함수형 프로그래밍이 가능하도록 하였습니다. 기본적으로 람다식은 아래와 같은 구문으로 이루어집니다.

( 매개변수 ) -> { 수행 코드 }
ex) (int a, int b) -> { return a + b; }
ex) (int a, int b) -> a + b ;
수행 코드가 단일 문장으로 끝나는 경우에는 {} 를 생략하고 바로 반환값을 출력할 수 있다.

함수형 인터페이스

자바에서의 함수형 프로그래밍에서 또 하나 빼놓을 수 없는 개념이 함수형 인터페이스 입니다. 함수형 인터페이스는 하나의 추상메서드만을 가지는 인터페이스로 함수를 객체처럼 다룰 수 있게 하여 람다식과 함께 사용되어 함수형 프로그래밍을 지원합니다. 함수형 인터페이스는 아래와 같이 구현합니다. 함수형 인터페이스는 @FunctionalInterface어노테이션을 명시하여 줍니다. 함수형 인터페이스는 기본적으로 기본 메서드 하나만을 선언할 수 있으나, static 메서드의 경우에는 여러 개를 선언하는 것이 가능합니다.

어* 함수형 인터페이스 

함수형 인터페이스로는 앞서 쓰레드 부분에서 사용했던 Runnable, Callable, Comparator, Consumer, Function, Predicate 등이 있습니다. 

* Runnable 예시

기존에 Runnable인터페이스를 implements를 사용하여 구현하였던과 다르고 바로 람다식으로 작성하여 사용할 수 있습니다.

- 이전의 코드

- 람다식을 사용한 코드 

람다식을 사용한 경우 인터페이스를 구현하기 위해 별도의 클래스를 생성하지 않아도 됩니다.

ex)

* comparator 예시

* Predicate 예시  - Predicate는 조건식의 표현을 위해 사용됩니다.

- 함수형 인터페이스 Consumer, Supplier, Function 예시 자바의 정석 803pg 참고

  • Runnable - run - 매개변수X, 반환값X
  • Supplier - get - 매개변수X, 반환값O
  • Comsumer - accept - 매개변수O, 반환값X
  • Function - apply - 매개변수O, 반환값O  매개변수와 반환값의 타입이 같은 경우 
  • Predicate - test - 매개변수O, 반환값O (반환 타입은 boolean)

*  매개변수와 반환값의 타입이 같은 경우 Function보다 UnaryOperator를 사용하는 것이 더욱 좋은 성능을 보일 수 있다.

* 예시
Collection - boolean remove(Predicate<E> filter) - 조건에 맞는 요소 삭제
Iterable - void forEach(Consumer<T> action) - 모든 요소에 작업 수행(반환값은 없음)
Map - V computeIfAbsent(K key, Function<K, V> f) - 해당 키 존재 시 작업 수행 후 결과 반환

예시 코드

public class LambdaEx4 {
    public static void main(String[] arge) {
        ArrayList<Integer> list = new ArrayList<>();
        for (int i=0; i<20; i++) {
            list.add(i);
        }

        list.forEach(i -> System.out.println(i+","));
        System.out.println();

        list.removeIf(i -> i % 2 == 0 || i % 3 == 0);
        System.out.println(list);

        list.replaceAll( i -> i*10);
        System.out.println(list);

        Map<String, String> map = new HashMap<>();
        map.put("1", "1");
        map.put("2", "2");
        map.put("3", "3");
        map.put("4", "4");

        map.forEach((k, v) -> System.out.println("{" +k+","+v+"}"));
    }
}

 

 

출처

자바의 정석

반응형