람다식이란 ? 자바8부터 제공
자바에서 함수형 프로그래밍(functional programming) 을 구현하는 방식이다.
함수기반의 프로그램 매개변수를 받아서 매개변수를 프로그래밍을 하게되면 외부변수들을 사용하지 않는다 순수 함수형 프로그래밍 외부의 다른 것에 부수적인 영향을 주지 않는다 다른 변수값이 변한다는가 이런일이 일어나지않아 병렬처리가 가능하다.
객체가없이 메소드를 호출한다는지 기능을 수행하는거에 쉽지가 않다
그런데 클래스를 생성하지 않고 함수 호출만으로 수행할수있는 기능을 제공
내부적으로 익명객체가 생성되는데 밖에 보이지 않고 심플하게 나온다.
함수형 프로그래밍이란 ?
순수 함수 를 구현하고 호출한다
외부변수를 사용하지않고 매개변수만 사용해서 구현 입력받은 자료를 기반으로 수행되고 외부에 영향을 미치지 않으므로 병렬처리등에 가능 안정적인 확장성 있는 프로그래밍 방식이다.
안정적인 프로그램 방식이다.
람다식 문법
Str -> {System.out.println(str); } 구현부가 한줄이면 중괄호 생략 가능
매개변수 -> 구현부
Str - > { return str.length(); } return 문은 중괄호를 생략할수 없다.
(x,y) -> x + y // 두 값을 더하여 반환
Str -> str.length() // 문자열 길이를 반환
두수중 큰수를 구하는 그런 람다식을 구현해보기
구현하기전에 메소드를 선언해야하는데 선언하기 위해 인터페이스 사용
가장큰수를 찾는 문제
@FunctionInterface 를 지정하면
인터페이스에서 메소드는 한개만 생성할수있다.
package lamda;
@FunctionalInterface // 람다식을 위한 인터페이스 표시해야한다.
// 함수형 인터페이스는 메소드를 2개 이상 선언할수없다.
public interface MyMaxNumber {
int getMaxNumber(int x , int y);
// void add(int x , int y);
}
인터페이스명 변수명 = 매개변수들 -> 구현부
변수명.함수호출시 구현부가 실행된다.
package lamda;
public class TestMyNumber {
public static void main(String[] args) {
MyMaxNumber max = (x,y) -> (x >= y) ? x : y; // 한줄이면 중괄호 생략가능 return은 중괄호 생략 못함
System.out.println(max.getMaxNumber(5, 10));
}
}
원래같았으면 인터페이스로 구현했을경우
문장 2개를 받는 makeString 메소드
package lamda;
@FunctionalInterface
public interface StringConcat {
public void makeString(String s1, String s2);
}
package lamda;
public class StringConImpl implements StringConcat {
@Override
public void makeString(String s1, String s2) {
System.out.println(s1 + "," + s2);
}
}
package lamda;
public class TestStringConcat {
public static void main(String[] args) {
StringConImpl impl = new StringConImpl();
impl.makeString("hello", "world");
StringConcat concat = (s,v) -> System.out.println(s + " , " + v);
concat.makeString("Hello", "World");
StringConcat concat2 = new StringConcat() { // 익명 내부 클래스로 구현
public void makeString(String s1, String s2) {
System.out.println(s1 +","+s2);
}
};
concat2.makeString("hello", "world");
}
}
타입을 매개변수로 받아서 넘기기
return 값에 람다식을 줘서 구현부를 변수로 받아서 그 변수로 메소드를 호출시키기
package lamda;
interface PrintString {
void showString(String str);
}
public class TestLamdba {
public static void main(String[] args) {
PrintString lamdbStr = s -> System.out.println(s);
lamdbStr.showString("Test");
showMyString(lamdbStr);//
PrintString test = returnString(); // 구현부를 변수 test로 받은거다 . 변수로 메소드를 호출
test.showString("Test3");
}
public static void showMyString(PrintString p) { // showString(lamdbaStr); 타입이 매개변수로 넘어간다.
p.showString("Test2");
}
public static PrintString returnString() {
return s -> System.out.println(s + "!!!"); // 람다식 자체가 반환이 된다.
}
}
'JAVA Programming' 카테고리의 다른 글
[75] 스트림 - 연산을 위한 객체 filter,map,sum,count,forEach (0) | 2020.07.21 |
---|---|
[74] 스트림 이란 ? 중간연산(map,filter) , 최종연산(forEach) (0) | 2020.07.20 |
[72] 익명내부클래스 , 지역내부클래스 (0) | 2020.07.20 |
[71] 내부클래스 외부클래스 <인스턴스 내부클래스 , 정적 내부클래스 (0) | 2020.07.20 |
[70] 컬렉션 프레임워크 요약정리 (0) | 2020.07.20 |