728x90
public class LamdaEx {
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; // i의 일의 자리를 없앤다.
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());
}
}
}
----------------------------결과(바뀔 수 있음)--------------------------------------
[22, 39, 82, 94, 49, 74, 100, 5, 47, 19]
[22, 82, 94, 74, 100, ]
[20, 30, 80, 90, 40, 70, 100, 0, 40, 10]
- 람다식에서 함수형 인터페이스들을 사용하는 예제이다.
- java.util.function 패키지에 일반적으로 자주 쓰이는 형식의 메서드를 함수형 인터페이스로 미리 정의해 놓음
- 매번 새로운 함수형 인터페이스를 정의하지 말고, 가능하면 이 패키지의 인터페이스를 활용하는 것이 메서드 이름도 통일되고, 재사용성이나 유지보수 측면에도 좋다.
- 위 예제에서 사용된 함수형 인터페이스는 아래와 같다.
함수형 인터페이스메서드설명
java.lang.Runnable | void run() | 매개변수도 없고, 반환값도 없음 |
Supplier<T> | T get() | 매개변수는 없고, 반환값만 있음 |
Consumer<T> | void accept(T t) | Supplier와 반대로 매개변수만 있고, 반환값이 없음 |
Function<T,R> | R apply(T t) | 일반적인 함수. 하나의 매개변수를 받아서 결과를 반환 |
Predicate<T> | boolean test(T t) | 조건식을 표현하는데 사용됨. 매개변수는 하나, 반환 타입은 boolean |
728x90
'JAVA' 카테고리의 다른 글
[디자인 패턴]Builder pattern 이란? (0) | 2022.03.22 |
---|---|
Java 8 LocalDateTime 직렬화 역직렬화 오류 (0) | 2022.03.02 |
스트림의 기본 및 간단한 특징 (0) | 2022.02.14 |
람다 함수(with 메서드 참조) (0) | 2022.02.14 |
람다(Lambda) 함수 사용법(with collection 함수) (0) | 2022.02.14 |