본문 바로가기
JAVA

Java8 Function

by e-pd 2020. 10. 18.

Java8 Lamda

인자 -> { 바디 }

 

인자

  • 인자가 없으면 (), 
  • 인자가 있으면 (foo, foo2...)
  • 인자는 컴파일러가 추론 가능

 

바디

화살표 오른쪽에 사용

내용이 한줄이면 {} 생략가능

 

 

함수형 인터페이스

1. Function<T,R>

T타입을 받아 R타입 리턴

 

기본 사용

  • apply

조합을 위해 사용할때는 

  • andThen
  • compose

 

apply

 

1
2
3
4
5
6
7
8
9
10
11
public class App {
 
    public static void main( String[] args) {
 
        Function<Integer, Integer> plus = (i) -> i + 2;
 
        System.out.println(plus.apply(10)); // 12
    }
 
}
 
cs

 

andThen

1
2
3
4
5
6
7
   public static void main( String[] args) {
 
        Function<Integer, Integer> plus = (i) -> i + 2;
        Function<Integer, Integer> multiply = (i) -> i * 2;
 
        System.out.println(plus.andThen(multiply).apply(10));
   }
cs

 

(10 + 2 )* 2 = 24

 

compose

1
2
3
4
5
6
7
public static void main( String[] args) {
 
        Function<Integer, Integer> plus = (i) -> i + 2;
        Function<Integer, Integer> multiply = (i) -> i * 2;
 
        System.out.println(plus.compose(multiply).apply(10));
    }
cs

(10 * 2) + 2 = 22

 

 

파라미터와 리턴의 값이 같으면 UnarayOperator로 치환할 수 있다.

1
2
3
4
5
6
7
8
  public static void main( String[] args) {
 
        UnaryOperator<Integer> plus = (i) -> i + 2;
        UnaryOperator<Integer> multiply = (i) -> i * 2;
 
        System.out.println(plus.compose(multiply).apply(10));
    }
 
cs

 

람다의 스코프

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    public static void main( String[] args) {
       showResult(); // 10
    }
 
    private static void showResult() {
        final int local = 1;
 
        IntConsumer result = (i) -> {
            System.out.println(i + local);
        };
 
        result.accept(9);
    }
 
cs

람다식에서 로컬 변수를 참조할 수 있다.

하지만 final로 값이 변하지 않는 값이어야한다. 

 

final을 생략할 수 있는 경우는 effectively final (사실상 final 인 변수)인 경우이다.

'JAVA' 카테고리의 다른 글

JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가  (0) 2020.11.17
Interface default methods  (0) 2020.10.19
Garbage Collection  (0) 2020.09.04
Java Heap  (0) 2020.09.04
JVM  (0) 2020.08.14