람다식
람다식(Lambda Expression)
- 함수(메서드)를 간단한 식(expression)으로 표현하는 방법
- 익명 함수(이름없는 함수)
- 함수와 메서드의 차이
- 근본적으로 동일. 함수는 일반적 용어, 메서드는 객체지향개념 용어
- 함수는 클래스에 독립적, 메서드는 클래스에 종속적
람다식 작성하기
람다식 작성시 주의사항
람다식은 익명 함수 X 익명 객체임
- 하지만
Object obj = new Object() { //내용//}
해도 max()함수 활용을 할수가없다.
- 이유는 참조변수(리모콘)에 해당 기능이없기때문이다!!!>>따라서 객체 타입변경 및 함수형 인터페이스가 필요함
함수형 인터페이스
- 람다식을 다루기 위해 사용됨
- 단 하나의 추상 메서드만 선언된 인터페이스
- 아래와 같이 클래스의 선언, 객체 생성 동시에 가능
- 이름 맞춰지는 조건 반드시 기억하기
- 람다식(익명 객체)를 다루기 위한 참조변수의 타입은 함수형 인터페이스로 해야한다.
- 또한 max()이름이 없는 익명의 람다이므로 반드시 매개변수 갯수, 반환타입 맞쳐야함.
- 익명의 객체 생성시 MyFunction 인터페이스 구현함.. 따라서 myFunction참조변수 사용가능
- 즉
(a,b) → a>b?a:b
만을 사용하더라도 앞에 참조변수의 타입으로 변경???
함수형 인터페이스 - example
- sort()메서드의 매개변수로 list, Comparator 타입을 바라보고있으므로, 정말 당연하게 람다식으로 쓰면, 개가 Comparator 인터페이스를 상속받은 함수가 되어 처리가능
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 31 32 33 34 35
| @FunctionalInterface interface MyFunction { void run(); }
class Ex14_1 { static void execute(MyFunction f) { f.run(); }
static MyFunction getMyFunction() { MyFunction f = () -> System.out.println("f3.run()"); return f; }
public static void main(String[] args) { MyFunction f1 = ()-> System.out.println("f1.run()");
MyFunction f2 = new MyFunction() { public void run() { System.out.println("f2.run()"); } };
MyFunction f3 = getMyFunction();
f1.run(); f2.run(); f3.run();
execute(f1); execute( ()-> System.out.println("run()") ); } }
|
java.util.function 패키지(1/3)
java.util.function 패키지(2/3)
java.util.function 패키지(3/3)
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 31 32 33 34 35 36 37 38 39 40 41 42 43
| import java.util.function.*; import java.util.*;
class Ex14_2 { public static void main(String[] args) { Supplier<Integer> s = ()-> (int)(Math.random()*100)+1; Consumer<Integer> c = i -> System.out.print(i+", "); Predicate<Integer> p = i -> i%2==0; Function<Integer, Integer> f = i -> i/10*10; List<Integer> list = new ArrayList<>(); makeRandomList(s, list); System.out.println(list); printEvenNum(p, c, list); List<Integer> newList = doSomething(f, list); 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)); }
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); } System.out.println("]"); }
static <T> void makeRandomList(Supplier<T> s, List<T> list) { for(int i=0;i<10;i++) { list.add(s.get()); } } }
|
이후 과정생략
이후는 심화학습같은 느낌들어서일단 넘어감
필요시 추후 학습
[https://www.youtube.com/watch?app=desktop&v=Kk1ZIrVZnqw&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=162](