1). 람다함수란?
람다 함수는 프로그래밍 언어에서 사용되는 개념으로 익명 함수(Anonymous functions)를 지칭하는 용어다.
2). 람다의 특징
두 개 이상의 입력이 있는 함수는 최종적으로 1개의 입력만 받는 람다 대수로 단순화 될 수 있다. - 커링 (Curring)
3). 익명함수?
함수의 이름이 없는 함수.
익명함수들은 공통으로 일급객체(First Class citizen)라는 특징을 가지고 있다.
이 일급 객체란? : 일반적으로 다른 객체들에 적용 가능한 연산을 모두 지원하는 객체를 가르킨다.
함수를 값으로 사용 할 수도 있으며 파라미터로 전달 및 변수에 대입과 같은 연산들이 가능하다.
4). 람다의 장단점
장점
1. 코드의 간결성 - 람다를 사용하면 불필요한 반복문의 삭제가 가능하며 복잡한 식을 단순하게 표현
2. 지연연산 수행 - 람다는 지연연상을 수행 함으로써 불필요한 연산 최소화
3. 병렬처리 가능 - 멀티쓰레디를 활용하여 병렬처리를 사용 할 수 있다.
단점
1. 람다식의 호출이 까다롭다.
2. 람다 stream 사용 시 단순 for문 혹은 while문 사용 시 성능이 떨어진다. => 내부적으로 iterator를 사용하여 구동하는데 깨끗한 기본코드가 원래 더 성능이 좋은건 ... 당연한지라..!
3. 불필요하게 너무 사용하게 되면 오히려 가독성을 떨어 뜨릴 수 있다. => 이것저것 다 람다로 표현하면 이해하기가 힘들 수 있다.
5). 람다의 표현식
1. 람다는 매개변수 화살표(->) 함수몸체로 이용하여 사용
2. 함수몸체가 단일 실행문이면 괄호{}를 생략 할 수 있다. !
3. 함수몸체가 return문으로만 구성되어 있는 경우 괄호{}를 생략 할 수 없다!
사용방법
() -> {}
() -> 1
() -> { return 1; }
(int x) -> x+1
(x) -> x+1
x -> x+1
(int x) -> { return x+1; }
x -> { return x+1; }
(int x, int y) -> x+y
(x, y) -> x+y
(x, y) -> { return x+y; }
(String test) -> test.length()
test -> test.length()
//Thread 사용시.
(Thread testThread) -> { testThread.start(); }
testThread -> { testThread.start(); }
람다를 사용할때는 함수형 Interface를 빼놓을수가 없다.
Functional Interface를 사용하는 방법을 알아두는것이 필수...!
간단하게 functional Interface를 만들어 사용해보자
첫번째 @FunctionalInterface를 선언하여 타겟 인터페이스를 만든다.
@FunctionalInterface
public interface functions {
public int calc(int x, int y);
}
두번째 람다식을 이용하여 사용해보자.
functions plusFunction = (x,y)-> x+y;
System.out.println(plusFunction.calc(1, 3));
심심하니까 Lambda와 Stream Interface를 이용하여 형변환 예제를 한번 해보도록하자
public class Score {
public static void main(String[] args) {
List<String> score = Arrays.asList("1,2,3,8,5,4,3".split(","));
//Stream을 이용한 메서드활용 List<String> to List<Integer> parsing
List<Integer> normal = parse(score);
//Stream + Lambda => List<String> to List<Integer> parsing
List<Integer> lamda = score.stream().map(Integer::parseInt).collect(Collectors.toList());
//합계 구하기
int sum = lamda.stream().mapToInt(Integer::intValue).sum();
System.out.println(sum);
}
//Stream을 사용한 파싱 메서드
public static List<Integer> parse(List<String> list) {
return list.stream()
.map(Integer::parseInt)
.collect(Collectors.toList());
}
}
각각을 비교하면 어떤 장점이 있는지 확인할수 있다.
간단하게 구현이 가능했다.
지난번에 java에서 제공하는 함수형 인터페이스를 봤었는데 다시한번 보는게 좋을거같다~!
'Java > Basic' 카테고리의 다른 글
[Java-Basic] Java 언어의 특징 및 OOP의 특징 (0) | 2021.07.14 |
---|---|
[Java-Basic] 함수형 인터페이스 (Functional Interface) 예제 (0) | 2021.05.31 |
[Java-Basic] Comparator과 Comparable을 사용한 배열 정렬 (0) | 2021.05.27 |
[Java-Basic] List<Obj> 특정값 기준 중복제거 방법 (0) | 2021.05.26 |
[Java-Basic] Java 정규표현식 (0) | 2021.05.24 |