본문으로 바로가기

함수형 인터페이스

Function<T,R>

java.util.function.Function 인터페이스는 제네릭 형식 T를 인수로 받아서 제네릭 형식 R 객체를 반환하는 추상 메서드 apply를 정의한다.
입력을 출력으로 맵핑하는 람다를 정의할 때 Function 인터페이스를 활용할 수 있다.

//자바8 이전에 익명클래스 사용
Function<String, Integer> toInt = new Function<String, Integer>() {  
    @Override  
  public Integer apply(String s) {  
        return Integer.parseInt(s);  
  }  
};

Integer num = toInt.apply("100");
//ex) String 으로 받은 값을 Integer로 리턴
final Function<String,Integer> toInt = v->Integer.parseInt(v);  
Integer nums = toInt.apply("102");

 

Consumer< T >

java.util.function.Consumer 인터페이스는 제네릭 형식 T 체를 받아서 void를 반환하는 accept 라는 추상메서드를 정의한다. T형식의 객체를 인수로 받아서 어떤 동작을 수행하고 싶을때 사용한다.
출력을 할때 자주 사용되며, 값을 리턴하지 않고 그대로 소비한다.

final Consumer<String> print = v -> System.out.println(v);  
print.accept("김문섭");  

final Consumer<String> greeting = g-> System.out.println("Hello " + g);  
greeting.accept("김달섭");

 

Predicate< T >

java.tuil.function.Predicate 인터페이스는 제네릭 형식 T 체를 받아서 boolean형 test 라는 추상메서드를 정의한다.

List<Integer> numbers = Arrays.asList(-3,-2,-1,0,1,2,3);  
Predicate<Integer> 양수 = p -> p>0;  
List<Integer> list = new ArrayList<>();  
for(Integer num : numbers){  
    if(양수.test(num)){  
        list.add(num);  
  }  
}

만약 여러개의 조건이 필요할때 아래와 같이 코드를 작성할 수 있 다.

private static <T> List<T> filter(List<T> list ,Predicate<T> filter){  
    List<T> res = new ArrayList<>();  
 for(T input : list) {  
        if(filter.test(input)){  
            res.add(input);  
  }  
    }  
    return res;  
}