함수형 프로그래밍 방식을 지원하는 표현식
람다식을 사용하면 코드가 간결해진다.(호불호)
자바 > 컬렉션(배열) 조작을 위해서 제공
//인터페이스 변수 = 람다식;
MyInterface m1 = () -> {};
(매개변수) -> {구현부};
a. (매개변수) : 추상 메서드의 인자리스트
b. -> 화살표(Arrow), 구현부 호출하는 역할(연결)
c. {구현부} : 추상 메서드의 구현부
@FunctionalInterface
//람다식을 저장할 수 있는 인터페이스라는 뜻
interface MyInterface {
void test();
}
class MyClass implements MyInterface{
@Override
public void test() {
System.out.println("실명 클래스에서 구현한 메서드");
}
}
//요구사항] MyInterface를 구현한 객체를 생성하시오.
//Case 1. 클래스 선언 + 객체 생성
MyInterface m1 = new MyClass();
m1.test();
//Case 2. 익명 객체 생성
MyInterface m2 = new MyInterface() {
@Override
public void test() {
System.out.println("실명 클래스에서 구현한 메서드");
}
};
m2.test();
//Case 3. 람다식
MyInterface m3 = () -> {
System.out.println("람다식으로 구현한 메서드");
}; //() = test이지만 생략됨
m3.test();
interface MultiParameterNoReturn {
void call(String name, int age);
}
interface ParameterReturn{
int call(int a, int b);
}
//main 함수 안
MultiParameterNoReturn pr8 =(String name, int age) -> {
System.out.println(name + "," + age);
};
pr8.call("홍길동", 20);
MultiParameterNoReturn pr9 =(name, age) -> {
System.out.println(name + "," + age);
};
pr9.call("홍길동", 30);
//*** 매개변수의 ()는 매개변수가 1일 때만 생략이 가능하다.
// MultiParameterNoReturn pr10 =name, age -> {
// System.out.println(name + "," + age);
// };
// pr10.call("홍길동", 40);
MultiParameterNoReturn pr11 =(name, age) -> System.out.println(name + "," + age);
pr9.call("홍길동", 50);
//*** 구현부에 return문이 유일하면 {}와 return을 생략할 수 있다.
ParameterReturn pr14 = (int a, int b) -> {
return a + b;
};
System.out.println(pr14.call(10, 20));
ParameterReturn pr15 = (a, b) -> a + b;
System.out.println(pr14.call(200, 20));
람다식의 가장 큰 장점 > 간단함(생산성)
람다식의 가장 큰 단점 > 인터페이스를 선언해야한다.
따라서!🙏
자바에서는 여러가지 형식의 람다식(추상메서드)를 저장할 수 있는 인터페이스를 미리 제공
표준 API 함수형 인터페이스
1. Consumer
//Consumer
//- 매개변수를 받아서 소비하는 업무를 구현하는 인터페이스
//- acceptXXX() 추상 메서드 제공
//java.util.function 패키지
Consumer<Integer> c1 = num -> System.out.println(num);
c1.accept(100);
Consumer<Integer> c2 = num -> System.out.println(num * num);
c2.accept(100);
2. Supplier
Supplier
매개변수 X , 반환값 O => 추상 메서드를 제공한다.
//Supplier
//매개 변수 없이 반환값을 돌려주는 업무를 구현하는 인터페이스
//- getXXX() 추상 메서드 제공
//반환타입 써주는 것
Supplier<Integer> s1 = ( )-> {return 10;};
System.out.println(s1.get());
Supplier<Double> s2 = ( )-> Math.random();
System.out.println(s2.get());
3. Function
//Function
//- 매개변수를 전달하면 처리 후 반환 값을 돌려주는 업무를 구현하는 인터페이스
//- applyXXX() 추상 메서드 제공
Function<Integer, Boolean> f1 = num -> num > 0;
System.out.println(f1.apply(10));
System.out.println(f1.apply(-10));
Function<String, Integer> f2 = str -> str.length();
System.out.println(f2.apply("홍길동입니다."));
//앞에 두개는 매개변수, 마지막 리턴
BiFunction<Integer,Integer,String> bf1 = (a,b) -> {
if(a>b) {
return "크다";
}else if( a<b) {
return "작다";
}else {
return "같다";
}
};
System.out.println(bf1.apply(20,10));
4. Operator
Function 하위셋
매개변수를 연산 후 반환하는 행동
UnaryOperator
BinaryOperator
매개변수 O , 반환값 O => 추상메서드 제공
//Operator
//- 매개변수를 전달하면 처리 후 반환 값을 돌려주는 업무를 구현하는 인터페이스
//- applyXXX() 추상 메서드 제공
//- 추상 메서드의 매개변수의 반환값이 자료형이 동일하다.
BiFunction<Integer,Integer,Integer> bf1 = (a,b) -> a + b;
System.out.println(bf1.apply(10, 20));
//매개변수 2개 => 매개변수 무조건 integer, 반환값도 integer => 위에랑 똑같음
//함수의 하위셋
BinaryOperator<Integer> bo1 = (a,b) -> a + b;
System.out.println(bf1.apply(10, 20));
//매개변수 1개
UnaryOperator<Integer> uo1 = a -> a*a;
System.out.println(uo1.apply(2));
5. Predicate
Function 하위셋
매개변수를 연산 후 반환하는 행동
Predicate
BiPredicate <T,U>
매개변수 O , 반환값 O => 추상메서드 제공
//Predicate
//- 매개변수를 전달하면 처리 후 반환 값을 돌려주는 업무를 구현하는 인터페이스
//- testXXX() 추상 메서드 제공
//- 논리 검사 > Boolean 반환
Function<Integer, Boolean> f1 = num -> num >0;
System.out.println(f1.apply(10));
System.out.println(f1.apply(-10));
//반환값이 무조건 boolean
Predicate<Integer> p1 = num -> num >0;
System.out.println(f1.apply(10));
System.out.println(f1.apply(-10));