Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Elasticsearch
- 코딩테스트
- 스프링
- 개발
- JPA
- ES
- 그리디
- spring boot
- database
- 개발자
- API
- 그리디알고리즘
- 자바
- 읽기쉬운코드
- 엘라스틱서치
- 애자일
- 프레임워크
- 알고리즘
- 코드
- Baekjoon
- 데이터베이스
- 클린코드
- Spring
- 코딩
- cleancode
- 애자일기법
- framework
- 백준
- Java
- 애자일프로그래밍
Archives
- Today
- Total
튼튼발자 개발 성장기🏋️
Lambda Expression 본문
반응형
Oracle에서 제공하는 java 1.8 docs를 살펴보면 상당히 많은 interface가 있다.
그 중에서 Function interface를 살펴보자.
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
// ...
}
이 인터페이스는 apply라는 하나의 abstract method(FunctionalInterface annotation)를 가진다. 보면 알 수 있겠지만, T 타입의 parameter를 받아 R 타입의 값을 리턴하는 메소드다.
public class Exercise {
public static void main(String[] args) {
Function<Integer, String> myEx = new Func();
System.out.println(myEx.apply(10));
}
}
class Func implements Function<Integer, String> {
@Override
public String apply(Integer integer) {
return String.valueOf(integer) + "입니다.";
}
}
상기 코드와 같이 Integer를 받아서 String 타입을 리턴하는 함수를 Object 형태로 구현했다.
문제는 이 Object를 필요할 때마다 생성해서 사용해야되나? 뭔가 찝찝하고 좋은 코드처럼 보이지 않는다.
이를 해결하기 위해 Lambda를 제공한다.
public class Exercise {
public static void main(String[] args) {
Function<Integer, String> myEx = (Integer p1) -> {
return p1 + "입니다.";
};
System.out.println(myEx.apply(10)); // 10입니다.
}
}
Lambda를 사용해서 나타낸다면, Function을 상속받는 class를 생성할 필요가 없어진다.
상기 코드는 Lambda의 기본 형태를 나타내지만 아래와 같이 생략을 할 수 있기때문에 간결함을 더해준다.
public class Exercise {
public static void main(String[] args) {
Function<Integer, String> myEx = p1 -> p1 + "입니다.";
System.out.println(myEx.apply(10)); // 10입니다.
}
}
Lambda의 생략은 아래와 같이 정리할 수 있다.
- 매개변수의 타입을 알 수 있을 때 타입 생략 가능
- 매개변수가 하나일 경우 생략 가능
- 바로 리턴하는 경우 중괄호 및 'return' 예약어 생략 가능
이번엔 BiFunction을 살펴보자. BiFunction은 T 타입과 U 타입을 매개변수로 갖고 R 타입을 리턴하는 apply 메소드를 갖는다.
@FunctionalInterface
public interface BiFunction<T, U, R> {
R apply(T t, U u);
// ...
}
public class Exercise {
public static void main(String[] args) {
BiFunction<Integer, Integer, String> myEx = (p1, p2) -> "매개변수는 " + p1 + "과 " + p2 + "입니다.";
System.out.println(myEx.apply(10, 100)); // 매개변수는 10과 100입니다.
}
}
이렇게 java에서 두 개의 매개변수를 받는 Function을 제공한다. 그렇다면 3개 이상 필요하다면 어떻게 될까?
이러한 부분은 직접 만들어 사용할 수 있다.
public class Exercise {
public static void main(String[] args) {
TriFunction<Integer, Integer, String, String> myEx = (p1, p2, p3) -> "더하면 " + (p1 + p2) + p3;
System.out.println(myEx.apply(10, 100, "입니다.")); // 더하면 110입니다.
}
}
@FunctionalInterface
interface TriFunction<T, U, V, R> {
R apply(T t, U u, V v);
}
반응형
'프로그래밍 > JAVA' 카테고리의 다른 글
Optional (0) | 2022.08.12 |
---|---|
Stream (0) | 2022.07.25 |
Method Reference (0) | 2022.07.14 |
Functional Interface (0) | 2022.07.06 |
함수형 프로그래밍 (0) | 2022.07.06 |