[JAVA] 자바 - 람다식 (Lambda) / Consumer<T>, Supplier<T>
by mini_min[JAVA]
자바 - 람다식 (Lambda) / Consumer<T>, Supplier<T>
✔️ 람다식 (Lambda) - 자바 8부터 제공
람다식은 메소드를 하나의 식으로 표현한 것이다.
객체 지향 언어보다는 함수 지향 언어에 가깝다.
메소드를 간략하면서도 명확한 식으로 표현할 수 있다!
✨ 람다식으로 메소드를 표현하면 이름 및 반환 값이 없어져서 익명 함수라고도 한다.
✨ 하나의 추상 메소드를 가진 인터페이스는 람다식 사용이 가능하다.
💡 작성형식 : (타입 매개변수) -> {실행문};
📓 반환 값 있는 메소드의 경우, return 대신 표현식만 있어도 된다.
📓 매개변수 타입이 추론 가능하면 생략 가능하다.
📓 매개변수가 하나면 () 생략이 가능하다.
📓 {} 문장이 하나이면 {} 를 생략이 가능하다.
public static void main(String[] args) {
//매개변수 없고, 리턴 타입이 void 인 lambda 식!
//함수에 이름이 없음
//아래 write 메소드를 재정의한 것임.
//{} 안에 문장이 하나인 경우, {} 를 생략해도 괜찮다.
User2 obj = () -> {System.out.println("람다식...");};
obj.write();
}
}
interface User2 {
public void write();
}
🔒 하나의 매개변수가 있고, 리턴 타입이 void 인 람다식!
-- 조건✨✨ : 인터페이스 안에 메소드가 하나 있어야한다.
하나의 메소드만 선언된 경우만 람다식이 가능하다.
public static void main(String[] args) {
// 하나의 매개 변수가 있고, 리턴 타입이 void 인 lambda 식!!!!!!!
User3 obj3 = (int a) -> {int n = a +10; System.out.println(n);};
//int 생략 가능. 어차피 아래에서 명시되어잇어서
// 매개변수 하나일 때, 가로도 생략 가능하다.int a / a
obj3.sub(5);
}
}
// 조건 : 인터페이스 안에 메소드가 하나 있어야한다!
//하나의 메소드만 선언된 경우에만 람다식이 가능
//@FunctionalInterface : 람다식으로 구현가능한지 검증함 / 이걸 쓰면 람다식 가능한지 판별해줌
@FunctionalInterface
interface User3 {
public void sub(int a);
}
💡 @FunctionalInterface : 람다식으로 구현가능한지 검증함 / 이걸 쓰면 람다식 가능한지 판별해줌!
🔒 매개변수가 두개이고 리턴 타입이 int인 람다식
public static void main(String[] args) {
// 매개변수가 두개이고 리턴 타입이 int인 람다식
//User4 obj = (x,y) -> {int z = x+y; return z;};
//User4 obj = (x,y) -> {return x+y;};
User4 obj = (x,y) -> x+y; //생략 가능
int s = obj.add(10, 5);
System.out.println(s);
}
}
@FunctionalInterface
interface User4 {
public int add(int a, int b) ;
}
✔️ 람다식에서 this
람다식에서 this 는 익명 객체가 아니라, 람다식을 구현한 클래스를 this 라고 한다.
public static void main(String[] args) {
Test5 t= new Test5();
t.using();
}
}
interface User5 {
public void sub();
}
class Test5 {
int x= 10;
class Demo5 {
int y = 20;
public void disp() {
int x = 100;
int z = 30;
//람다식
User5 obj = () -> {
//주의 : 람다식에서의 this 는 익명객체가 아니라 람다식을 구현한 클래스(Test5$Demo5)
//람다를 구현한 클래스를 this 라고 한다.
System.out.println(this);
System.out.println(Test5.this.x);
System.out.println(y);
System.out.println(this.y);
System.out.println(z);
};
// 에러. 람다에서 사용된 로컬변수는 final 속성이다.
//z = 50;
obj.sub();
}
}
public void using() {
Demo5 d = new Demo5();
d.disp();
}
}
💡 Test5 클래스의 int x 값을 출력하고 싶으면, Test5.this.x
✔️ 표준 API의 함수적 인터페이스
자바 8에서부터 빈번하게 사용하는 함수적 인터페이스는 java.util.function 표준 API 패키지로 제공한다.
✨ Consumer<T>
: 대개, 매개변수가 있고 리턴 값이 없는 추상 메소드를 가진 인터페이스다.
✨ Supplier<T>
: 서플라이어는 매개변수는 없고❌ 리턴 값이 있는 추상 메소드를 가진 인터페이스이다.
✨ Function<T>
: 매개변수 값이 있고, 리턴 값이 있는 추상 메소드를 가진 인터페이스이다.
🔒 Consumer<T> / IntSupplier
public static void main(String[] args) {
// 매개변수가 있고, void 추상 메소드를 가진 인터페이스
// 매개변수 :a
Consumer<Long> c = a -> {System.out.println(a);};
c.accept(100L);
// 매개변수가 없고 리턴값이 있는 (int) 메소드를 가진 인터페이스
IntSupplier obj = () -> (int)(Math.random()*10)+1;
int n = obj.getAsInt();
System.out.println(n);
}
💡 Consumer<T>
추상메소드 : accept() 객체 매개변수로 가짐 ...~
💡 IntSupplier : 매개변수가 없고 리턴값이 있는 (int) 메소드를 가진 인터페이스
추상메소드 : getAsInt() : int 형을 리턴
'Java' 카테고리의 다른 글
[JAVA] Fork join Pool (java Concurrency 툴) (0) | 2023.07.17 |
---|---|
[JSP] 천원 단위 표시 콤마 DecimalFormat (0) | 2022.09.28 |
[JAVA] 자바 - InetAddress 클래스 / URL 클래스 (0) | 2022.09.05 |
[JAVA] 자바 - 컴퓨터 네트워크 (프로토콜, 포트, IP) (0) | 2022.09.05 |
[JAVA] 자바 - 객체 직렬화(ObjectStream, Object Serialization) (2) | 2022.09.05 |
블로그의 정보
개발자 미니민의 개발로그
mini_min