Java/Java8

(JAVA8) 람다식 (1)

주누 2020. 1. 3. 09:11

람다식을 사용하는 이유?

자질구레한 코드 사용 없이 간결하게 코드를 구현할 수 있기 때문. 

 

람다 이전의 코드

Comparator<Apple> appleComparator = new Comparator<Apple>() {
    @Override
    public int compare(Apple o1, Apple o2) {
        return o1.getWeight() - o2.getWeight();
    }
};

 

람다식 적용

Comparator<Apple> appleComparator = (Apple o1, Apple o2) -> o1.getWeight() - o2.getWeight();

람다의 구조

  1. 파라미터 리스트 : Comparator의 compare 메서드의 파라미터 (두 개의 사과)
  2. 화살표 : 화살표는 람다의 파라미터 리스트와 바디를 구분
  3. 람다의 바디 : 두 사과의 무개를 비교. return 값에 해당

함수형 인터페이스 : 정확히 하나의 인터페이스를 지정하는 메서드

함수형 인터페이스로 무엇을 할 수 있나?

  • 람다 표현식으로 추상 메서드 구현을 직접 전달 가능 -> 전체 표현식을 함수형 인터페이스의 인스턴스로 취급

 

 

익명 클래스를 람다화 

Runnable runnable = () -> System.out.println("runnalble");

함수형 인터페이스를 파라미터로 받는 메서드를 만들어서 람다식을 사용

public static void process(Runnable runnable) {
    runnable.run()                                                                                                                                                                                                    ;
}
process(() ->{
    System.out.println("choi");
});

https://jwdeveloper.tistory.com/116?category=833327

 

(JAVA) 람다식으로 향하는 과정

1. 녹색 사과 필터링 리스트를 돌면서 green 인 color가 있으면 리스트에 저장해서 리턴한다. public class Exercise { public static void main(String[] args) { List inventory = Arrays.asList(new Ap..

jwdeveloper.tistory.com


함수 디스크립터

일종의 설계도를 의미.

함수형 인터페이스의 람다 표현식의 시그니처를 서술하는 메서드를 의미

 

ApplePredicate에는 test라는 미구현 메서드가 있고 이는 파라미터로 Apple을 받음을 정의 return type은 boolean

public interface ApplePredicate {
    boolean test(Apple apple);
}

전략과 비교 대상을 파라미터로 전송

public static boolean appleProcess(ApplePredicate applePredicate, Apple apple) {
    System.out.println(apple.getWeitght());
    return applePredicate.test(apple);
}

실행

Boolean result = appleProcess(((Apple apple2) -> apple2.getWeitght() >30), apple);
System.out.println("result:: "+result);

실행 어라운드 패턴 

준비 , 정리 가 실행할 작업을 감싸는 형태

동작 파라미터화 와 실행어 라운드 패턴 적용

public static String processFile() throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    return br.readLine();
}

위의 코드는 현재 한 개의 행밖에 읽어올 수 없다.

 

동작 파라미터화

 

 한 번에 여러 줄 or 자주 사용되는 단어를 반환하려면? -> processFile을 메서드로 동작을 전달

 

동작을 파라미터로 받는 메서드 생성

public static String processFile(BufferedReaderProcessor p) throws IOException {
	//초기화
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	//실행
    return p.processFile(br);
}

동작을 전송하여 해당 메서드 실행

String processFile = processFile((BufferedReader br) -> br.readLine() + br.readLine());

실행하는 부분에 대한 전략을 파라미터로 받으면서 실행 어라운드 패턴으로 동작할 수 있게 되었다.

실행결과


Code Link

https://github.com/mike6321/PURE_JAVA/tree/master/Java8/2Week/lamda

 

mike6321/PURE_JAVA

Contribute to mike6321/PURE_JAVA development by creating an account on GitHub.

github.com

References

자바 8 인 액션
국내도서
저자 : 라울-게이브리얼 우르마(RAOUL-GABRIEL URMA),마리오 푸스코(MARIO FUSCO),앨런 마이크로프트(ALAN MYCROFT) / 우정은역
출판 : 한빛미디어 2015.04.01
상세보기