관리 메뉴

武裝

[Java] 람다식 본문

프로그래머로 레벨업!/Java

[Java] 람다식

zeechive 2024. 3. 25. 17:49

1. 람다식

 

-익명구현객체

-추상메서드를 하나만 가지는 인터페이스 

	Thread thread = new Thread(() -> {
		System.out.println("run 메소드 재정의 ");
	});

화살표로 표현하며, 끝날 때는 (;) 으로 마무리 필요. 

 

 

package ch16;

@FunctionalInterface
public interface Calculable {
	void calculate (int x, int y);

}
package ch16;

public class LambdaExample {

	public static void main(String[] args) {
		action((x,y) -> { 
			int result = x + y;
			System.out.println(" resule : "+ result);
		});

		action((x,y) -> { 
			int result = x - y;
			System.out.println(" resule : "+ result);
		});
	}

	private static void action(Calculable calculable) {
		int x = 10;
		int y = 4;
		
		calculable.calculate(x, y);
		
	}

}

 

 

 

매개변수가 없는 람다식

함수형 인터페이스의 추상 메소드에 매개변수가 없을 경우 람다식은 아래와 같이 작성한다.

() -> {
    실행문;
    실행문;
}

실행문이 하나일 경우에는 중괄호를 생략할 수 있다.

() -> 실행문

 

 

package ch16;

public class Button {
	
	
	// 함수형 인터페이스 
	@FunctionalInterface
	public static interface ClickListner{
		void onClick();
	}
	
	
	//필드 
	private ClickListner clickListner;
	
	//메소드 
	public void setClickListner(ClickListner clickListner) {
		this.clickListner = clickListner;
	}
	
	public void click() {
		this.clickListner.onClick();
	}

}

 

package ch16;

public class ButtonEvxample {

	public static void main(String[] args) {
		Button btnOk = new Button();
		
		btnOk.setClickListner(() -> {
			System.out.println(" 버튼을 클릭하였습니다. ");
		});
		
		btnOk.click();
		
		Button btnCancel = new Button();
		
		btnCancel.setClickListner(() ->System.out.println(" 취소 버튼을 클릭했습니다. "));

		btnCancel.click();
	}

}

 

 

 

 

 

매개변수가 있는 람다식

 

- 매개 변수가 하나인 경우, 괄호 생략은 가능할 수 있다, 이때는 타입 또는 var을 붙일 수 없다. 

package ch16;

@FunctionalInterface
public interface Workable {
	void work(String name, String job);

}
package ch16;

@FunctionalInterface
public interface Speakable {
	void speak(String content);

}
package ch16;

public class Person {
	public void action1(Workable workable) {
		workable.work("홍길동", "프로그래밍");
	}
	
	public void action2 (Speakable speakable) {
		speakable.speak("안녕하세요");
	}

}
package ch16;

public class LambdaExample703 {

	public static void main(String[] args) {
		Person person = new Person();
		
		person.action1((name, job) -> {
			System.out.print(name + "이");
			System.out.println(job + "을 합니다.");
		});
		person.action1((name, job) -> System.out.println(name+"이 "  + job + "을 합니다."));
		
		
		person.action2(word -> {
			System.out.print("\"" + word + "\"");
			System.out.println("라고 말합니다.");
		});
		person.action2(word -> System.out.println("\"" + word + "\"" + "라고 말합니다. 2"));
	}

}

 

 

 

리턴값이 있는 람다식

함수형 인터페이스의 추상 메소드에 리턴값이 있을 경우 람다식은 아래와 같이 작성한다.

(매개변수, ...) -> {
    실행문;
    return 값;
}

return문이 하나만 있을 경우에는 return키워드와 중괄호를 생략할 수 있다.

(매개변수, ...) -> 값;

 

 

package ch16.sec04;
	
	@FunctionalInterface
	public interface Calculable {
		double cal(double x, double y);
}
package ch16.sec04;

public class Person {
	public void action(Calculable calculable) {
		double result = calculable.cal(10, 4);
		System.out.println(" 결과 : " + result);
	}
}
package ch16.sec04;

public class LambdaExample {

	public static void main(String[] args) {
		Person person = new Person();
		
		//실행문이 두 개 이상일 경우
		person.action((x,y) -> {
			double result = x + y;
			return result;
		});
		
		// 리턴문이 하나만 있을 경우(연산식) 
		person.action((x,y) -> (x+y));
		
		
		// 리턴문이 하나만 있을 경우(메소드 호출) 
		person.action((x,y) -> sum(x,y));
	}
	
	public static double sum(double x, double y) {
		return (x + y);
		
	}
}

 

 

 

 

메소드 참조

 메소드를 참조해서 매개변수의 정보 및 리턴 타입을 알아내,

람다식에서 불필요한 매개변수를 제거하는 것을 목적으로 한다.

 

- 정적 메소드를 참조 = 클래스 이름 뒤에 ::기호를 붙이고 정적 메소드 이름을 기술.

                                      클래스 :: 메소드

- 인스턴스 메소드 참조 = 먼저 객체를 생성한 다음 참조 변수 뒤에 ::기호를 붙이고 인스턴스 메소드 이름을 기술.

                                         참조변수 :: 메소드

 

-매개변수 메소드 참조

(a, b) -> {a.instanceMethod(b)};

 

클래스 :: instanceMethod

 

 

package ch16.sec04;

public class Computer {
	public static double staticMethod(double x, double y) {
		return x + y;
	}
	
	public double instanceMethod(double x, double y) {
		return x * y;
	}

}
package ch16.sec04;

public class MethodReferenceExample {

	public static void main(String[] args) {
		Person person = new Person();
		
		// 정적메소드의 경우 
		// person.action((x,y) -> Computer.staticMethod(x,y)); 
		person.action(Computer :: staticMethod);
		
		//인스턴스 메소드의 경우 재정의 필요
		Computer com = new Computer();
		//person.action((x,y) -> com.instanceMethod(x,y));
		person.action(com :: instanceMethod);
	}
}

 

 

 

매개변수 메소드 참조 

package ch16.sec04;


@FunctionalInterface
public interface Comparable {
	int compare (String a, String b);
}
package ch16.sec04;

public class Person02 {
	public void ordering(Comparable comparable) {
		String a = "홍길동";
		String b = "김길동";
		
		int result = comparable.compare(a,b);
		
		if (result < 0) {
			System.out.println(a + "은" + b + "보다 앞에 옵니다.");
		} else if (result == 0) {
			System.out.println(a + "은" + b + "과 같습니다.");
		} else {
			System.out.println(a + "은" + b + "보다 뒤에 옵니다.");
		}
		
		
	}

}
package ch16.sec04;

public class MethodReference {

	public static void main(String[] args) {
		Person02 person = new Person02();
		person.ordering(String :: compareToIgnoreCase);

	}

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'프로그래머로 레벨업! > Java' 카테고리의 다른 글

[Java] 입출력 스트림 1  (2) 2024.03.27
[Java] 스트림 요소 처리  (0) 2024.03.26
[Java] 컬렉션 자료 구조 2  (0) 2024.03.25
[Java] 컬렉션 자료 구조 1  (1) 2024.03.22
[Java] 멀티 스레드 2  (2) 2024.03.22