📚 람다 표현식이란?
함수형 프로그래밍을 구현하기 위한 함수식이다.
말하자면, 자바의 메소드를 간결한 함수식으로 표현한 것이다
int add(int x, int y) {
return x + y;
}
// 위의 메서드를 람다 표현식을 이용해 아래와 같이 단축 시킬수 있다. (메서드 반환 타입, 메서드 이름 생략)
(int x, int y) -> {
return x + y;
};
// 매개변수 타입도 생략 할 수 있다.
(x, y) -> {
return x + y;
};
// 함수에 리턴문 한줄만 있을 경우 더욱 더 단축 시킬 수 있다. (중괄호, return 생략)
(x, y) -> x + y;
출처: https://inpa.tistory.com/entry/☕-Lambda-Expression [Inpa Dev 👨💻:티스토리]
이처럼, 기존에 메소드의 매개변수로 추가하면서 작성했던 자바의 코드식을 람다식으로 변형하여 '->' 화살표 코드식으로 넣음으로써 코드의 간결함을 제공해준다.
위의 예시의 이름이 없는 람다식은 '익명함수'라고 한다.
람다의 장점은 불필요한 코드를 줄이고, 가독성을 높이기 위함이다.
예시) Thread 호출
Thread thread = new Thread( () -> {
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
});
람다식의 형변환
사실 람다식은 익명 객체이고 타입이 없다. 정확히 말하면 함수형 인터페이스로 람다식을 참조할 수 있을 뿐이다. 그래서 사실 인터페이스 타입의 변수에 람다식을 할당하는 행위는 캐스팅 연산자가 생략 되어 있다.
IAdd func = () -> {});
IAdd func = (IAdd) (() -> {}); // 원래는 양변의 타입이 다르므로 형변환이 필요
stream에서 람다를 사용할 시 for문 보다 성능이 떨어진다
어플리케이션 성능에 매우 민감한 사람이라면 치명적인 단점이 될 수 도 있다.
아래 예제는 0 부터 10000 까지 단순 순회하는 로직을 stream의 람다와 단순 for문으로 구성하고 각각 실행시간을 나노초로 구하는 코드이다. 결과를 보듯이 두 실행시간 차이는 결코 적지 않다.
📚 자바 스트림(Stream)이란?
java8부터 추가된 기술로, 람다를 활용하여 배열과 컬렉션을 가지고 함수형으로 간단하게 처리할 수 있는 기술이다.
기존의 for문과 Iterator을 사용하면 코드가 길어져 가독성과 재사용성이 떨어지고, 데이터마다 다른 방법으로 다뤄야하는 불편함이 있었다.
스트림을 사용하면 데이터 소스를 추상화할 수 있고 데이터를 다루는데 자주 사용하는 메소드를 정의해 놓아서 데이터 소스에 상관없이 모두 같은 방식으로 다룰 수 있으므로 코드의 재사용성이 높아진다.
스트림의 특징
- 원본 데이터 소스를 변경하지 않는다: 읽기만 가능
- 일회용이다: 한번 사용하면 닫혀서 재사용이 불가능하다.
- 최종 연산 전까지 중간 연산을 수행하지 않는다. 최종연산에는 꼭 정제된 요소를 반복하거나 집계작업을 수행한다.
- 작업을 내부 반복으로 처리한다: forEach()는 매개변수에 대입된 람다식을 데이터 소스의 모든 요소에 적용한다.
- 병렬 처리가 쉽다: 멀티쓰레드 사용
- 기본형 스트림을 제공한다: Stream<Integer> 대신 IntStream이 제공되어서 오토박싱과 언박싱 등의 불필요한 과정이 생략되고 숫자의 경우 유용한 메소드를 추가로 제공한다. (.sum(), .average() 등)
출처)
출처: https://inpa.tistory.com/entry/☕-Lambda-Expression [Inpa Dev 👨💻:티스토리]
'🍎 Backend > JAVA' 카테고리의 다른 글
[JAVA] 제네릭, 지네릭스(Generics) (0) | 2025.01.09 |
---|---|
[JAVA] 어노테이션(Annotation) (0) | 2025.01.09 |
[JAVA] CS면접대비 자바와 객체지향 정리 (0) | 2025.01.02 |
[java] abstract(추상) vs implements의 비교 (1) | 2024.12.20 |
[JAVA] 해시 맵 (0) | 2023.12.11 |