람다
- 람다식 사용법
- 람다식은 익명객체다 (자바에서는 함수는 클래스에 종속되기 떄문에) 익명객체란 이름 없는 객체,클래스 라고도한다. 재사용성 없는 일시적으로만 사용되는 이 객체는 예전에 학습했던 자바swing 이벤트처리,스레드 Ruannable 등을 할때 사용한다. 다시 말하자면 람다식은 이 익명객체를 간단히 표현 하는 방법이다. 밑과 같은 로직에서 int max라는 메서드를 표현하려 하는것이다. ```java
public class LamdaEx_1 {
public static void main(String[] args) {
new Object() {
int max(int a, int b) {
return a > b ? a : b;
}
};
// int value = object.max(3,5); 사용불가
}
}
```
- 함수형 인터페이스
하나의 추상 메서드만 선언된 인터페이스. 람다식을 다루려면 위와같은 Object 타입으로는 max 를 사용할 수 없다 object 에는 max라는 메서드가없다. 그렇기 때문에 자바는 참조형 변수를 통해 객체를 사용한다 → 참조형 변수의 타입을 만들어 줘야 한다 → 함수형 인터페이스를 사용해 람다식을 사용한다.
<기본형 함수형 인터페이스>
| java.lang.Runnalbe | void run() | 매개변수, 반환 모두 없음 |
| --- | --- | --- |
| Supplier<T> | T get() | 매개변수 없음, 반환 T |
| Comsumer<T> | void accept(T t) | 매개변수 T, 반환 없음 |
| Function<T, R> | R apply(T t) | 매개변수 T, 반환 R |
| Predicate<T> | boolean test(T t) | 매개변수 T, 반환 boolean |
| | | |
| | | |
```java
package JavaJungSuk3_Study.Example.java8;
import java.util.*;
public class CollectionLamda {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add(i);
}
list.forEach(i -> System.out.print(i + ",")); //consumer
System.out.println();
//람다로하면 코드의 양을 매우 줄일수 있다.
// Iterator it = list.listIterator();
// while (it.hasNext()) {
// System.out.println(it.next());
// }
list.removeIf(x -> x % 2 == 0 || x % 3 == 0);
System.out.println(list);
list.replaceAll(i -> i * 10);
System.out.println(list);
Map<String, String> map = new HashMap<>();
map.put("1", "1");
map.put("2", "2");
map.put("3", "3");
map.put("4", "4");
map.forEach((k, v) -> System.out.print("{" + k + "," + v + "},"));
System.out.println();
}
}
```
위와같이 컬렉션프레임워크도 코드의 양을 매우 줄일수있다 기존의 이터레이터를 쓰지않고
- Variable Capture
- 메소드, 생성자 레퍼런스
람다식을 더 간단히 만든것이 메서드 레퍼런스다.
클래스::메서드
의 형태를 가진다public class MethodRefenrce {
public static void main(String[] args) {
Function<String, Integer> f = (String s) -> Integer.parseInt(s);
Function<String, Integer> f1 = Integer::parseInt;
}
}