/* 람다식이란 */
자바 1.8 부터 사용 가능하다. 동일한 패러미터, 동일한 패러미터 값으로 여러 동작을 하고 싶을 때가 있다.
ex)
동일한 패러미터 : double x, double y,
동일한 패러미터 값 : x = 1.0 , y = 4.0,
여러 동작 x+y , x-y, x/y ...
이 경우, 함수를 여럿 만드는 것이 아니라 람다식을 이용한 함수형 프로그래밍을 한다. 데이터 처리의 다형성이라고도 볼 수 있다.
코드가 간결해진다. (가독성)
병렬처리 기능을 할 수 있어 멀티쓰레드에 용이하다
람다식의 형식은 다음과 같다.
람다식 : (매개변수, ...) -> { 처리문 }
먼저 추상 인터페이스를 활용한 람다식이 있다.
/* 추상인터페이스 이용1 */
본 코드는, @FunctionalInterface 어노테이션을 사용했다. 필수는 아니지만, 컴파일 과정에서 추상 메소드가 하나 인지 검사해서 정확성을 높여준다.
@FunctionalInterface
public interface Math1 {
void calculate(int x, int y);
}
아래의 코드를 보면 동일한 패러미터 int x , int y,
동일한 패러미터 값 x=1, y=2,
여러 동작 x+y, x-y.
여러 동작을 람다식을 이용한 함수형 프로그래밍을 통해 해결했다.
public class PracticeLambda{
public static void (String[] args){
action( (x,y) -> { //람다식1
int result = x + y; //3
System.out.println(result);
});
action( (x,y) -> { //람다식2
int result = x - y; //1
System.out.println(result);
});
}
public static void action(Math1 math1){
int x = 2;
int y = 1;
math1.calculate(x,y);
}
}
/* 추상인터페이스 이용2 */
@FunctionalInterface
public interface Math2{
public int add(int a, int b);
}
public class PracticeLambda2 {
public static void main(String[] args){
Math2 math2 = (a,b) -> { return a+b; }; // ;가 두개임을 조심하자
math2.add(10,20); //30
}
}
이와 같이 람다식을 변수로 선언후. 활용도 가능하겠다.
/* 추상인터페이스 이용3 (패러미터 없는 경우)*/
@FunctionalInterface
public interface Math3{
void doTheMath();
}
public class Person {
public void calculate(Math3 math3){
math3.doTheMath();
}
}
public class PracticeLambda3 {
public static void main(String[] args){
Person person = new Person();
person.calculate( () -> System.out.println("Okay He or She is calculating rn"));
//처리문이 하나이면 중괄호 {} 생략 가능
}
}
여기서는 Person 클래스에 Math3를 매개변수로 갖는 calculate() 메소드를 생성했다.
이 경우를 보면, 자바 코드 실행시 자바의 JVM 이 추적을 해서 PracticeLambda3 -> Person -> Math3의 doTheMath() 함수까지 잘 도달한 것을 알 수 있다.
물론 Person 없이도 사용 가능하다. 이때는 앞에 설명한 것 처럼 reference할 수 있는 정적 (static) 메소드를 선언해줘야 한다.
public class PracticeLambda4 {
public static void main(String[] args){
action() -> System.out.println("Okay you are calculating rn");
// 처리문 하나이므로 중괄호 {} 생략가능
}
public static void action(Math3 math3){
math3.doTheMath();
}
}
/* 추상인터페이스 이용4 (패러미터 있는 경우)*/
@FunctionalInterface
public interface Math4{
void doTheMath(String name); //패러미터 추가
}
public class Student {
public void calculate(Math4 math4){
math4.doTheMath("JAVA"); //패러미터 추가
}
}
public class PracticeLambda5 {
public static void main(String[] args){
Student student = new Student();
student.calculate( (name) -> System.out.println(name + "! are you calculating rn?");
//처리문이 하나 인경우 중괄호 {} 생략 가능
}
}
이 경우를 보면, 자바 코드 실행시 자바의 JVM 이 추적을 해서 PracticeLambda5 -> Student -> Math4의 doTheMath() 함수까지 잘 도달한 것을 알 수 있다
/* 추상인터페이스 이용5 (리턴값 있는 경우)*/
@FunctionalInterface
public interface Math5{
int sum(int x, int y); //리턴값이 int
}
public class PracticeLambda6 {
public static void main(String[] args){
Friend friend = new Friend();
//처리문이 두 개 이상일 경우
friend.calculate((x,y) -> {
double value = x+y;
return value;
}
//처리문이 하나 일 경우
friend.calculate((x,y) -> (x+y));
}
}
/* 추상인터페이스 이용6 (메소드 참조)*/
:: 를 이용한다
@FunctionalInterface
public interface Math6{
int calculate(int x, int y); //리턴값이 int
}
public class Member {
public void calculate(Math5 math5){
int answer = math5.calculate(1,2);
System.out.println("Answer :" + answer);
}
}
public class Calculater {
public int add(int x, int y) {
return x+y;
}
}
public class PracticeLambda7 {
public static void main(String[] args){
Member membder = new Member();
//인스턴스 메소드
Calculater calculater = new Calculater();
member.calculate(calcalater :: add);
}
}
'자바' 카테고리의 다른 글
[JAVA] 컬렉션 - LinkedList (0) | 2024.02.07 |
---|---|
[JAVA] 벡터 Vector (0) | 2024.02.06 |
[JAVA] 컬렉션 - ArrayList (0) | 2024.02.05 |
[Java] Predicate 인터페이스 (1) | 2023.12.20 |
[JAVA] 제네릭 타입 (0) | 2023.11.23 |