람다식이란?
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+"}"));
}
}
출처
자바의 정석
'JAVA' 카테고리의 다른 글
[ Java ] - QueryDSL이란 무엇인가? (+기본 세팅) (0) | 2024.05.19 |
---|---|
[ Java ] - 입출력 하기, 스트림 종류 및 예시 코드 (0) | 2023.10.30 |
[ Java ] - 난수 생성 (0) | 2023.10.18 |
[ Java ] - 프로세스와 쓰레드 - 02) (0) | 2023.10.17 |
[ Java ] - 프로세스와 쓰레드 - 01) (0) | 2023.10.16 |