람다식(Lambda Expression) 이란?
- 람다식은 메소드를 하나의 식으로 표현한 것
- 객체지향보다는 함수지향언어
- 메소드를 간략하면서도 명확한 식으로 표현할 수 있도록 해준다.
- 메소드를 람다식으로 표현하면 메소드의 이름 및 반환 값이 없어지므로 익명함수 라고 함.
- 람다식의 형태는 매개 변수를 가진 코드 블록이지만 런타임 시에는 익명 구현 객체를 생성
- 하나의 추상 메소드를 가진 인터페이스는 람다식 사용이 가능!
람다식 작성 형식
Ex 1) 리턴타입이 void이며 파라미터가 없는 람다식
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package ex0825;
public class Lambda {
public static void main(String[] args) {
//리턴타입이 void이며 파라미터가 없는 람다식
User2 obj = ()-> {System.out.println("안녕");};
//User2 obj = ()-> System.out.println("안녕"); ==> 식이 한줄일 때, {}생략가능.
obj.write();
}
}
interface User2{
public void write();
}
|
cs |
Ex 2) 리턴타입이 void이며 파라미터가 1개인 람다식
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
package ex0825;
public class Lambda2 {
public static void main(String[] args) {
//매개변수 1개, 리턴타입 void 람다식 ==> 1) , 2), 3) 모두 같은 결과.
// 1) User3 obj = (int a) -> {int n = a+10; System.out.println(n);};
// 2) User3 obj = (a) -> {int n = a+10; System.out.println(n);}; ==> 괄호안에 타입안써주면 알아서 인식해줌
User3 obj = a -> {int n = a+10; System.out.println(n);}; //==> 매개변수 하나이면 괄호생략가능
obj.sub(5);
}
}
@FunctionalInterface //람다가 가능하지 않는 경우 오류
interface User3{
public void sub(int a);
}
|
cs |
Ex 3) 리턴타입이 int이며 파라미터가 2개인 람다식
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
package ex0825;
public class Lambda3 {
public static void main(String[] args) {
//매개변수 2개, 리턴타입 int인 람다식 ==> 아래 모두 같은결과
// 1) User4 u = (a,b) -> {int c = a+b; return c;};
// 2) User4 u = (a,b) -> {return a+b;};
User4 u = (a,b) -> a+b;
System.out.println(u.add(10, 5));
}
}
@FunctionalInterface //람다가 가능하지 않는 경우 오류
interface User4{
public int add(int a, int b);
}
|
cs |
람다식 기본 문법
람다식 Consumer EX
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
package ex0825;
import java.util.function.Consumer;
import java.util.function.IntSupplier;
public class Consumer_ex1 {
public static void main(String[] args) {
Consumer<Long> c = (t) -> System.out.println(t);
c.accept(100L);
IntSupplier i = () -> (int)(Math.random()*100)+1;
System.out.println(i.getAsInt());
}
}
|
cs |
람다식 Runnable EX
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
package ex0825;
import java.util.Calendar;
public class Runnable_Rambda1 {
public static void main(String[] args) {
// 1초에 한번씩 시간나오게
Runnable r = () -> {
while (true) {
String s = String.format("%tT", Calendar.getInstance());
System.out.println(s);
try {
Thread.sleep(1000);
} catch (Exception e) {
}
}
};
Thread t = new Thread(r);
t.start();
}
}
|
cs |
메소드 참조(Method Reference)란 ?
- 메소드 참조는 메소드를 간결하게 지칭할 수 있는 방법으로 람다식이 하나의 메소드만 호출하는 경우
메소드 참조를 이용하여 람다식을 간략히 할 수 있다.
- 이미 존재하는 이름을 가진 메소드를 람다로써 사용할 수 있도록 참조하는 역할을 한다.
- 메소드 참조는 메소드를 참조해서 매개변수의 정보 및 리턴타입을 알아내어, 람다식에 불필요한
매개 변수를 제거하는 것이 목적이다.
- 메소드 참조는 메소드명 앞에 구분자(::)를 붙이는 방식으로 사용.
1. 생성자의 메소드 참조
2. static의 메소드 참조
3. instance 메소드 참조
Ex1 )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
package ex0825;
public class Lambda4 {
public static void main(String[] args) {
//정수를 문자열로
User5 u1 = (n)->{return String.valueOf(n);};
User5 u2 = (n)->String.valueOf(n);
User5 u3 = String::valueOf;
System.out.println(u1.convert(10));
System.out.println(u2.convert(10));
System.out.println(u3.convert(10));
String s = sub(10,u2);
System.out.println(s);
}
public static String sub(Integer num, User5 u) {
return u.convert(num);
}
}
@FunctionalInterface //람다가 가능하지 않는 경우 오류
interface User5{
public String convert(Integer n);
}
|
cs |
Ex2 )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
package ex0825;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Stream;
public class Stream_ex1 {
public static void main(String[] args) {
List<String> list = Arrays.asList("자바", "오라클", "웹");
//컬렉션 예
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
System.out.print(s + " ");
}
System.out.println();
//스트림 예
Stream<String> st = list.stream();
//st.forEach(s->System.out.println(s)); //람다식
st.forEach(System.out::print); //static 메소드 참조
System.out.println();
}
}
|
cs |
'JAVA' 카테고리의 다른 글
[JAVA] 어노테이션(Annotation) (0) | 2020.08.25 |
---|---|
[ JAVA ] Thread (0) | 2020.08.20 |
[JAVA] 파일처리 예시 (0) | 2020.08.18 |
[JAVA] 입출력 스트림 (I/O Stream) (0) | 2020.08.18 |
[JAVA] 생성자 (4) | 2020.08.11 |