Java

[Java] 람다 표현식 사용 방법

cob 2023. 5. 22. 11:06

 

람다 표현식(Lambda Expressions)이란?
Java 8에서 도입된 함수형 프로그래밍의 핵심 기능으로 람다 표현식은 익명 함수(Anonymous Functions)를 간결하게 표현하는 방법이다. 함수를 변수에 할당하거나 다른 함수에 전달하는 등의 작업을 수행할 수 있다.

 

 

 


1. 람다 표현식 구문

(parameter) -> { expression }
  • parameter : 매개변수를 정의하고, 매개변수를 받지 않는 경우 빈 괄호 '()'를 사용
  • expression  : 실행할 함수를 정의한다. 식(expression)이 하나인 경우 중 괄호 '{}'를 생략할 수 있다.

 

1-1) 익명함수와 람다 표현식 비교

// 익명 함수
Function<Integer, Integer> anonymousFunction = new Function<Integer, Integer>() {
    @Override
    public Integer apply(Integer number) {
        return number * 2;
    }
};

// 람다 표현식
Function<Integer, Integer> lambdaExpression = number -> number * 2;

// 익명 함수 사용
int result1 = anonymousFunction.apply(5); // 결과: 10

// 람다 표현식 사용
int result2 = lambdaExpression.apply(5); // 결과: 10

 

 


2. 람다 표현식 사용 예

2-1) 매개 변수가 없는 람다 표현식

Runnable runnable = () -> {
    System.out.println("Hello, World!");
};

 

 

2-2) 매개 변수가 있는 람다 표현식

Comparator<Integer> comparator = (a, b) -> a.compareTo(b);

 

 

2-3) 메서드 참조를 사용한 람다 표현식

Function<String, Integer> converter = Integer::parseInt;

 

 

2-4) 조건문과 반환문을 사용한 람다 표현식

Predicate<Integer> isEven = n -> {
    if (n % 2 == 0) {
        return true;
    } else {
        return false;
    }
};

 

 

 


3. 주로 사용되는 상황

3-1) 고차함수

public class HigherOrderFunctionsExample {
    public static void main(String[] args) {
        // 고차 함수인 filter를 사용하여 리스트에서 짝수만 필터링하는 예시
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        List<Integer> evenNumbers = filter(numbers, n -> n % 2 == 0);
        System.out.println(evenNumbers); // 출력: [2, 4, 6, 8, 10]
    }

    // 고차함수 filter 구현 
    public static List<Integer> filter(List<Integer> list, Predicate<Integer> predicate) {
        List<Integer> result = new ArrayList<>();
        for (Integer element : list) {
            if (predicate.test(element)) {
                result.add(element);
            }
        }
        return result;
    }
}
  • filter 함수를 사용하여 리스트에서 조건에 맞는 요소를 필터링하는 기능을 구현

 

 

3-2) 동적 파라미터

동일한 코드를 여러 동작에 대해 다르게 수행할 수 있도록 하는 방법
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

public class BehaviorParameterizationExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        // 짝수를 필터링하는 동작
        List<Integer> evenNumbers = filter(numbers, n -> n % 2 == 0);
        System.out.println("Even numbers: " + evenNumbers); // 출력: [2, 4, 6, 8, 10]

        // 홀수를 필터링하는 동작
        List<Integer> oddNumbers = filter(numbers, n -> n % 2 != 0);
        System.out.println("Odd numbers: " + oddNumbers); // 출력: [1, 3, 5, 7, 9]
    }

    public static List<Integer> filter(List<Integer> list, Predicate<Integer> predicate) {
        List<Integer> result = new ArrayList<>();
        for (Integer element : list) {
            if (predicate.test(element)) {
                result.add(element);
            }
        }
        return result;
    }
}

 

 

3-3) 함수형 인터페이스

한수형 인터페이스는 단 하나의 추상 메서드를 가진 인터페이스이다.

// 함수형 인터페이스 정의
@FunctionalInterface
interface Calculator {
    int calculate(int a, int b);
}


public class FunctionalInterfaceExample {
    public static void main(String[] args) {
        Calculator addition = (a, b) -> a + b;
        int sum = addition.calculate(5, 3);
        System.out.println(sum); // 출력: 8

        Calculator subtraction = (a, b) -> a - b;
        int difference = subtraction.calculate(7, 2);
        System.out.println(difference); // 출력: 5
    }
}
  • Calculator 인터페이스를 정의하고, 익명 함수를 사용하여 덧셈과 뺄셈을 수행하는 기능을 구현

 

  // Runnable은 run 메서드만 가지고있는 함수형 인터페이스이다.
  Runnable runnable = () -> System.out.println("Runnable");
  
  runnable.run(); // 출력 : Runnable

 

 

3-4) 스트림 처리

import java.util.Arrays;
import java.util.List;

public class StreamExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        // 스트림을 사용하여 짝수를 필터링하고 합산하는 예시
        int sum = numbers.stream()
                .filter(n -> n % 2 == 0)
                .mapToInt(Integer::intValue)
                .sum();

        System.out.println(sum); // 출력: 6
    }
}
  • Callback 인터페이스를 정의하고, 익명 함수를 사용하여 콜백을 실행하는 기능을 구현

 

 

반응형