티스토리 뷰

함수형 인터페이스

- 추상 메소드를 딱 하나만 가지고 있는 인터페이스

- @FuncationInterface 애노테이션을 가지고 있는 인터페이스

 

람다 표현식

- 함수형 인터페이스의 인스턴스를 만드는 방법으로 쓰일 수 있음

- 코드를 줄일 수 있음

- 메소드 매개변수, 리턴타입, 변수로 만들어 사용할수도 있음

 

package java8study;


@FunctionalInterface
public interface RunSomething {

    ///추상형 메소드가 하나만 있으면 함수형 인터페이스
    void doIt();

   // void doAgain(); //하나 더 만들면 에러


    //인터페이스 안에서 static 메소드 정의가능
    static void printName(){
        System.out.println("Jooooo!");
    }
    
    //default 메소드 정의
    default void printAge(){
        System.out.println("29");
    }

}

 

package java8study;

public class Foo {

    public static void main(String[] args) {
        RunSomething runSomething = () -> System.out.println("Hello");
        runSomething.doIt();
    }
}

 

 

 

 

자바에서 제공하는 함수형 인터페이스 (많이 쓰이는거 위주)

1. Function<T,R>

- T타입을 받아 R타입을 리턴하는 함수 인터페이스

- 함수 조합용 메소드 andThen, compose

- 입력값과 결과값이 같은 타입일 때, UnaryOperator 사용 가능

ex :  UnaryOperator<Integer> plus10,

      UnaryOperator<Integer> multiply2로 써도 됨

 

2.Supplier<T>

- T탕비의 값을 제공하는 함수 인터페이스

- .get()

 

3. Predicate<T>

- T타입을 받아 boolean을 리턴하는 함수 인터페이스

- .test(T)

- And, Or, Negate 로 조합가능

package java8study;

import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

public class Foo {

    public static void main(String[] args) {

       // Plus10 plus10 = new Plus10();
       // System.out.println("->" + plus10.apply(1));

      //  1.Function
      //  Function<Integer, Integer> plus10 = (i) -> i+10;
      //  System.out.println("-> " + plus10.apply(1));

        //// 함수 조합하기 compose, andThen
        Function<Integer, Integer> plus10 = (i) -> i+10;
        Function<Integer, Integer> multiply2 = (i) -> i*2;

        //뒤에오는걸 먼저 계산후, 앞에 함수 계산
        Function<Integer, Integer> multiply2AndPlus10 = plus10.compose(multiply2);
        System.out.println("multiply2AndPlus10 : " + multiply2AndPlus10.apply(2));

		// 앞에 오는걸 먼저 계산
        Function<Integer, Integer> plus10AndMultiply2 = plus10.andThen(multiply2);
        System.out.println("plus10AndMultiply2 : " + plus10AndMultiply2.apply(2));



        ///Supplier 인자값 없이 T타입의 값을 제공
        Supplier<Integer> get10 = () -> 10;
        System.out.println("Supplier :" + get10.get());



        ///Predicate true false
        Predicate<String> startWithJ = (s) -> s.startsWith("j");
        Predicate<Integer> isEven = (i) -> i%2 ==0;
        System.out.println("Predicate1 : " + startWithJ.test("jeong"));
        System.out.println("Predicate2 : " + isEven.test(50));
    }
}

 

 

 

강의 : 인프런 더 자바, Java8

 

 

 

댓글
최근에 올라온 글
최근에 달린 댓글
링크
Total
Today
Yesterday