모던자바 인액션 3장

su dong·2023년 8월 11일
0

질문거리

  1. 함수형 인터페이스란? -> 하나의 추상메서드만을 가지는 것.
    -> 그렇다면 왜 하나만 가지는 것이 중요한가?
  2. process(()-> System.out.println("hello world3"));이건 람다에서 객체에서의 소비일까, 아니면 객체 생성의 예시일까?
  3. 실행어라운드 패턴 4단계가 이해가 잘 안된다...

람다 표현식

3.1 람다란 무엇인가?

익명함수를 단수화한 것, 함수형 인터페이스라는 문맥에서 람다를 사용할 수 있음.

-> 람다 표현식을 함수형 인터페이스의 인스턴스로 취급 할 수 있다.

람다 표현식 구성

(apple a1, Apple a2) -> a1.getweigth().compareTo(a2.getweight());

람다 파라미터 + 화살표 + 람다 바디

람다 사용 사례별 예제

1. 불리언 표현식

(List<String> list) -> list.isEmpty()
(Apple a) -> a.getweight() > 150

2. 객체 생성

"객체의 생성"이란, 람다 표현식을 통해 새로운 값을 생성하거나 객체를 생성하는 작업을 의미합니다.

()-> new Apple(10)
() -> 42

3. 객체에서 소비

Consumer 인터페이스는 주어진 입력을 받아 소비하는 작업을 수행하는 함수형 인터페이스입니다. 객체에서 소비는 주로 데이터의 변경, 출력, 로깅 등의 동작을 의미합니다.
코드 (String s) -> s.length()은 입력으로 문자열을 받아 문자열의 길이를 반환하므로, 실제로 데이터의 변경 또는 소비가 아닙니다. 따라서 Consumer와는 다른 개념입니다.

(Apple a)->{
	System.out.println(a.getWeight());
}

(int x, int y) -> 
{
	System.out.println("Result:");
	System.out.println(x+y);
}

4. 객체에서 선택/ 추출

선택 추출은 람다 표현식을 사용하여 원하는 작업을 추출하고 해당 작업을 필요한 곳에서 호출하는 것을 의미합니다.
따라서, (String s) -> s.length() 코드는 소비하는 개념보다는 주어진 문자열의 길이를 선택적으로 추출하는 개념에 더 가깝습니다.

(String s)-> s.length()

5. 두 값을 조합

(int a, int b) -> a+b

6. 두 객체 비교

(Apple a1, Apple a2)->
a1.getWeight().compareTo(a2.getWeight())

람다 표현 방법

표현식 스타일

(parameter) -> expression

블록 스타일

(parameter) -> {statement;}

3.2 함수형 인터페이스

정확히 하나의 추상 메서드를 지정하는 인터페이스, 디폴트 메서드는 여러개라도 상관없음.

예시

java.util.Comparator

public interface Comparator< T >{
	int compare(T o1, T o2)
}

java.lang.Runnable

public interface Runnable{
	void run();
}

java.awt.event.ActionListener

public interface ActionListner extends EventListener{
	void actionPerformed(ActionEvent e);
}

java.util.concurrent.Callable

public interface Callable< V >{
	V call() throws Exception;
}

java.security.PrivilegedAction

public interface PrivilegedAction< T >{
	T run();
}

-> 람다 표현식을 함수형 인스턴스의 인스턴스로 취급 할 수 있다.

활용 예제

public static void process(Runnable r){
	r.run();
}

Runnable r1 = () -> System.out.println("hello world1")

process(r1);
process(()-> System.out.println("hello world2"));

3.2.2 함수 디스크립터

추상 메서드의 시그니처란 메서드의 이름, 매개변수 목록, 그리고 반환 타입으로 구성된 메서드의 선언 형태를 말합니다
람다 표현식의 시그니처를 표현하는 메서드를 함수 디스크립터라고 한다.

3.3 람다 활용

실행 어라운드 패턴
Predicate< T >
Consumer < T >
Function< T, R >
기본형 특화

3.4 함수형 인터페이스 사용

predicate
consumer
function

3.5 형식추론, 검사

3.6 메서드 참조

매서드 참조
생성자 참조

profile
사람들을 돕는 문제 해결사, 개발자 sudong입니다. 반갑습니다. tkddlsqkr21@gmail.com

0개의 댓글