- Stream, lambda에 대해서 설명하기
람다식
- 식별자 없이 실행 가능한 함수이다.
- 다시말해, 함수를 따로 만들지 않고 코드 한줄에 함수를 써서 그것을 호출하는 방식이다.
사용법
(매개변수1, 매개변수2,...) -> {함수몸체}
(매개변수) -> 함수몸체
(매개변수) -> {return 0;}
- 매개변수 : 함수몸체를 실행하기 위해 필요한 값을 제공하는 역할을 한다.
- 매개변수 이름은 개발자가 자유롭게 지정할 수 있고, 인자 타입을 명시하지 않아도 된다.
예제1
@FunctionalInterface
interface Say{
int someting(int a,int b);
}
class Person{
public void hi(Say line) {
int number = line.someting(3,4);
System.out.println("Number is "+number);
}
}
@FunctionalInterface
: 구현해야 할 추상 메소드가 하나만 정의된 인터페이스
- 두 개 이상의 메소드가 선언되면 오류를 발생시킨다.
람다식 없이 사용
Person rin = new Person();
rin.hi(new Say() {
public int someting(int a, int b) {
System.out.println("My Name is Coding-Factory");
System.out.println("Nice to meet you");
System.out.println("parameter number is "+a+","+b);
return 7;
}
});
람다식 사용
Person rin = new Person();
rin.hi((a,b) ->{
System.out.println("This is Coding-Factory!");
System.out.println("Tank you Lamda");
System.out.println("parameter number is "+a+","+b);
return 7;
});
예제2
interface Compare{
public int compareTo(int a, int b);
}
public class Ramda2 {
public static void exec(Compare com) {
int k = 10;
int m = 20;
int value = com.compareTo(k, m);
System.out.println(value);
}
public static void main(String[] args) {
exec((i,j)->{
return i+j;
});
}
}
예제3
public class Ramda3 {
@FunctionalInterface
public interface MyNumber{
int getMax(int num1, int num2);
}
public static void main(String[] args) {
MyNumber max = (x,y)->(x>=y)? x:y;
System.out.println(max.getMax(10, 30));
}
}
Runnable 인스턴스 생성
public class RunnableEx {
public static void main(String[] args) {
Runnable runnable = () -> {
for (int i = 0; i < 30; i++) {
System.out.println(i);
}
};
Thread thread = new Thread(runnable);
thread.start();
}
}
Thread 호출
Thread thread = new Thread( () -> {
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
});
new Thread(()->{
System.out.println("Welcome Heejin blog");
}).start();
장단점
장점
- 코드가 간결해진다
- 가독성이 향상된다
- 함수를 만드는 과정이 줄어든다
- 병렬 프로그래밍이 용이하다
단점
- 람다를 활용한 무명함수는 재활용이 불가능하다.
- 디버깅이 까다롭다
- 재귀로 만들기에는 부적합하다.