📗 BOOK/스프링 입문을 위한 자바 객체 지향의 원리와 이해

부록 B - 자바 8 람다와 인터페이스 스펙 변화

미미누 2022. 4. 22. 22:03

B.1 람다가 도입된 이유


람다를 지원하기 위한 인터페이스를 함수형 인터페이스라고 한다.

 

B.2 람다란 무엇인가?


람다란 한 마디로 코드 블록이다. 코드 블록인 람다를 메서드의 인자나 반환값으로 사용할 수 있게 된다.

코드 블록을 변수처럼 사용할 수 있다는 것

 

public class B003 {
	public static void main(String[] args) {
    	Runnable r = () -> {
        	System.out.println("Hello Lambda 3!!!");
        };
        
        r.run();
       }
    }

 

람다의 구조

(인자 목록) -> { 로직 }

 

B.3 함수형 인터페이스


추상 메서드를 하나만 가지는 인터페이스를 함수형 인터페이스라고 한다.


 

B.4 메서드 호출 인자로 람다 사용

public class B007 {
	public static void main(String[] args) {
    	MyFunctionalInterface mfi = a -> a * a;
        
        dolt(mfi);
     }
 
public static void dolt(MyFunctionalInterface mfi) {
	int b = mfi.runSomething();
    
    System.out.println(b);
   }
}

 

자바 8 API에서 제공하는 함수형 인터페이스

 

B.7 컬렉션 스트림에서 람다 사용


Arrays.stream(ages)
	.filter(age -> age < 20)
    .forEach(age -> System.out.format(age));

stream(ages) : 기존 배열을 이용해 스트림을 얻는다.

filter : Predicate 함수형 인터페이스를 filter 메서드의 인자로 제공

forEach: 스트림 내부 반복을 실행(소비 인터페이스 Cousumer 요구)

 

메서드 레퍼런스와 생성자 레퍼런스

메서드 레퍼런스 예시

Arrays.stream(ages).sorted().forEach(System.out::println);
Arrays.stream(nums)
	.map(num -> Math.sqrt(num))
    .forEach(sqrtNum -> System.out.println(sqrtNum));
    
Arrays.stream(nums)
	.map(Math::sqrt)
    .forEach(System.out::println);

배열 각각의 인자를 루트를 씌우고, 각각을 출력하는 메서드 레퍼런스

람다식이 map 클래스::정적메서드로 바뀐 것을 볼 수 있음.

람다식이 println은 인스턴스::인스턴스메서드로 바뀐 것을 볼 수 있음.


생성자 레퍼런스

클래스::new