함수형 인터페이스 제공
람다 표현식을 쓸 수 있는 인터페이스는 오직 public 메서드 하나만 가지고 있는 인터페이스여야한다. 자바 8에서 이러한 인터페이스를 특별히 함수형 인터페이스라고 부르고, 함수형 인터페이스에서 제공하는 단 하나의 추상 메서드를 함수형 메서드라고 부른다. 인터페이스를 사용해야하는 개발자 입장에서 람다 표현식을 사용하기 위해 메서드가 하나뿐인 인터페이스를 제공해야하는 번거로움을 해결하기 위해 함수형 인터페이스를 만들고 java.util.function 패키지로 제공하고있다.
GitHub - westssun/practicalJava8: [BOOK] Practical modern java8
[BOOK] Practical modern java8. Contribute to westssun/practicalJava8 development by creating an account on GitHub.
github.com
Consumer 인터페이스
요청받은 내용을 소비한다. = 아무런 값도 리턴하지 않고 요청 받은 내용을 처리한다. (리턴타입 void)
public class ConsumerExample {
public static void execute(List<String> nameList, Consumer<String> consumer) {
for (String name : nameList) {
consumer.accept(name);
}
}
public static Consumer<String> getExpresiion() {
/* 리턴해주는 것은 '람다식' 자체이다 */
return (String name) -> System.out.println(name);
}
public static void main(String[] args) {
List<String> nameList = new ArrayList<>();
nameList.add("정수빈");
nameList.add("김재호호");
/* 람다 전달 */
ConsumerExample.execute(nameList, getExpresiion());
}
}
Function 인터페이스
생성할때 두 개의 제네릭 타입을 정의해야 하며 각각의 이름은 T와 R이다.
해당 인터페이스의 함수형 메서드는 T를 인수로 받아서 R을 리턴하는 apply 메서드를 가지고있다.
특정한 클래스를 파라미터로 받아서 처리한 후 리턴하는 형태이다.
리턴값이 반드시 필요할 경우 사용한다
public class FunctionExample {
public static int execution (String context, Function<String, Integer> function) {
return function.apply(context);
}
public static void main(String[] args) {
/* 인수 T : context, 리턴 R : context.length() */
FunctionExample.execution("Hello", (String context) -> context.length());
}
}
Predicate 인터페이스
리턴 타입이 반드시 특정 클래스여야한다. (boolean 타입)
제네릭 타입으로 선언된 객체를 파라미터로 받아서 처리한 후 참/거짓 중 하나를 리턴한다.
public class PredicateExample {
public static boolean isValid (String name, Predicate<String> predicate) {
return predicate.test(name);
}
public static void main(String[] args) {
PredicateExample.isValid("", (String name) -> !name.isEmpty());
}
}
Supplier 인터페이스
Consumer 인터페이스와 반대이다.
입력 파라미터는 없고 리턴 타입만 존재한다.
입력 없이 출력만 있어서 공급자라는 이름을 사용하였고, get 메서드를 사용할 수 있다.
public class SupplierExample {
public static String execute(Supplier<String> supplier) {
return supplier.get();
}
public static void main(String[] args) {
String version = "2.0";
SupplierExample.execute(() -> {return version;});
}
}
Operator 인터페이스
모든 Operator 계열의 인터페이스는 Function 인터페이스의 하위 인터페이스이다. 그렇기 때문에 Functional 인터페이스의 함수형 메서드 apply를 그대로 사용하고 상속관계로 인해 Operator 인터페이스를 위한 별도의 함수형 인터페이스는 제공할 수 없다.
- 1) UnaryOperator
하나의 연산을 가진다.
- 2) BinaryOperator
입력 파라미터가 2개인 함수형 메서드를 제공한다.
public class OperatorExample {
public static void main(String[] args) {
/** UnaryOperator */
UnaryOperator<Integer> operatorA = (Integer t) -> t * 2;
System.out.println(operatorA.apply(1));
/** BinaryOperator */
BinaryOperator<Integer> operatorB = (Integer a, Integer b) -> a + b;
System.out.println(operatorB.apply(1, 2));
}
}
'Coding > Java' 카테고리의 다른 글
[Java8] 인터페이스 default 메소드 사용 예제와 인터페이스 메서드 추가 유연하게 구현방법 (0) | 2021.02.06 |
---|---|
자바에서 call by value, call by reference 이해하기 (0) | 2021.02.06 |
JAVA8 스트림 예제로 익숙해지기 (0) | 2020.11.28 |
자바 List의 null 체크 (with isEmpty()) (0) | 2020.11.07 |
java8에서의 날짜/시간 API (LcalDate/LocalTime) (0) | 2020.11.06 |