람다식 : jdk 1.8부터 추가
람다식 도입 : 자바 -> 객체지향언어 + "함수형 언어"
람다식
: 매서드를 하나의 식으로 표현
[* 객체를 기반으로 프로그램을 구현하고, 기능이 필요하면 클래스, 클래스 안 메서드 호출 해야하는 방식에서 함수의 호출만으로도 프로그램을 만들 수 있게 됨
-> 함수와 메서드는 입력과 출력이라는 점에서 비슷하나,
함수는 일반적인 용어면서 클래스에 독립적이고, 메서드는 객체지향용어이면서 클래스에 종속적이다.!]
- 람다식의 구현
//---> 일반 메서드
반환타입 메서드이름(매개변수) {
문장~~;
}
//---> 람다식
(매개변수) -> { 문장~~~; }
ex)
int add(int x, int y) {
return x + y; }
// ------------> 람다식
(int x, int y) -> { return x+y; }
① 반환값이 있는 메서드 : return, {}, ; 생략가능 ( return 있는 경우 {} 생락 불가)
(int x, int y) -> x + y
② 매개변수 타입이 추론 가능한 경우 생략 가능 : int, double 등 생략가능
(x, y) -> x+y
③ 매개변수 하나일 경우 () 생략가능, 2개인 경우 생략 불가
x -> x+x // ok
int x -> x+x //error
(int x) -> x+x //ok
- 함수형 인터페이스
: 람다식은 메서드 이름이 없고, 실행하는데 필요한 매개변수와 그 실행코드를 구현한 것임
자바에서는 참조변수를 통해 메서드를 호출하는데 람다식에는 메서드가 없음 ...
이를 구현하기 위해 함수형 인터페이스(메서드 오직 1개)를 만들고, 인터페이스에 람다식 구현할 메서드 선언!
//함수형 인터페이스 생성
@FunctionalInterface
interface lambda {
public void method(String s1, String s2);
}
// 추상메서드 구현
class lambdachild implements lambda{
@Override
public void method(String s1, String s2) {
System.out.println(s1 + s2);
}
}
public class lambdatest {
public static void main(String[] args) {
//람다테스트
lambda c = (s,v) -> System.out.print(s + v);
String s1 = "Hello ";
String s2 = "World";
c.method(s1, s2);
}
}
- java.util.function 패키지
: 자주 쓰이는 형식의 메서드를 함수형 인터페이스로 미리 정의했기 때문에 이 패키지의 인터페이스 활용
- 예제(자바의 정석 Ex14_5)
class LambdaEx5 {
public static void main(String[] args) {
Supplier<Integer> s = () -> (int)(Math.random()*100)+1; //s는 1~100난수
Consumer<Integer> c = i -> System.out.print(i + ","); //c는 i입력받기
Predicate<Integer> p = i -> i%2==0; //p는 i받아 짝수일때 true
Function<Integer, Integer> f = i -> i/10*10; //f는 i받아 i/10*10 반환
List<Integer> list = new ArrayList<>(); //list에 담기
makeRandomList(s, list); //makeRandomList s를 받아 list에 담기
System.out.println(list);
printEvenNum(p, c, list); //printEvenNum p에서 ture값 c에 입력되어 list 담기
List<Integer> newlist = doSomething(f,list); // doSomething i/10*10리턴해서 newlist에 담기
System.out.println(newlist);
}
static <T> List<T> doSomething(Function<T, T> f, List<T> list) {
List<T> newlist = new ArrayList<T>(list.size());
for(T i : list) {
newlist.add(f.apply(i)); // 1의 자리 없애서 새 list담기
}
return newlist;
}
static <T> void printEvenNum(Predicate<T> p, Consumer<T> c, List<T> list) {
System.out.print("[");
for(T i : list) {
if(p.test(i)) //짝수검사
c.accept(i); //맞으면 i출력해서 list 담기
}
System.out.println("]");
}
static <T> void makeRandomList(Supplier<T> s, List<T> list) {
for(int i=0; i<10; i++) {
list.add(s.get()); // Supplier로부터 1~100 난수받아 list에 담기
}
}
}
참고 : 자바의 정석(남궁성)
'JAVA' 카테고리의 다른 글
JAVA_입출력 (0) | 2021.11.04 |
---|---|
JAVA_BufferedReader, StringTokenizer, BufferedWriter (0) | 2021.10.17 |
JAVA_Thread1 (0) | 2021.08.08 |
JAVA_제네릭, 열거형, 애너테이션 (0) | 2021.08.07 |
JAVA_컬렉션 프레임워크(Set, Map) (0) | 2021.08.06 |
댓글