1. 람다함수란?
1.프로그래밍 언어에서 사용되는 개념으로 익명함수(Anonymous function)을 지칭하는 용어
2.현재 사용되고 있는 람다의 근간은 수학과 기초 컴퓨터과학 분야에서의 람다 대수이다. 람다대수는 간단히 말하자면 수학에서 사용하는 함수를 보다 단순하게 표현하는 방법
2. 람다의 특징
1. 람다 대수는 이름을 가질 필요가 없다 → 익명함수 (Anonymous functions)
2. 두 개 이상의 입력이 있는 함수는 최종적으로 1개의 입력만 받는 람다 대수로 단순화 될 수 있다 → 커링(Curring)
ㅁ익명함수란?
말 그대로 함수의 이름이 없는 함수, 익명 함수들은 공통으로 일급객체(First Class citizen)라는 특징을 가지고 있습니다.
일급객체란?
일반적으로 다른 객체들에 적용가능한 연산을 모두 지원하는 개체를 가르킵니다. 함수를 값으로 사용 할 수 도있으며, parameter로 전달 및 변수에 대입 하기와 같은 연산들이 가능합니다.
3. 람다의 장단점
•
장점
1.
코드의 간결성 → 불필요한 반복문의 삭제가 가능하며, 복잡한식을 단순하게 표현 가능
2.
지연연산 수행 → 지연연산을 수행 함으로써 불필요한 연산을 최소화
3.
병렬처리 가능 → 멀티쓰레드를 활용하여 병렬처리를 사용 할 수 있음
4. 람다의 표현식
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 lam) -> lam.length()
lam -> lam.length()
(Thread lamT) -> { lamT.start(); }
lamT -> { lamT.start(); }
//잘못된 유형 선언된 type과 선언되지 않은 type을 같이 사용 할 수 없다.
(x, int y) -> x+y
(x, final y) -> x+y
Java
복사
5. 람다식 예제(기존 자바 → 람다식)
//기존 자바문법
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Welcome Heejin blog");
}
}).start();
//람다식문법
new Thread(()->{
System.out.println("Welcome Heejin blog");
}).start();
Java
복사
6. 함수형 인터페이스
@FunctionalInferface
FunctionalInterface는 일반적으로 '구현해야 할 추상메소드가 하나만 정의된 인터페이스`를 가르킵니다.
자바 컴파일러는 이렇게 명시된 함수형 인터페이스에 두 개 이상의 메소드가 선언되면 오류 발생 시킵니다.
//구현해야 할 메소드가 한개이므로 Functional Interface이다.
@FunctionalInterface
public interface Math {
public int Calc(int first, int second);
}
//구현해야 할 메소드가 두개이므로 Functional Interface가 아니다.
//(오류 사항)
@FunctionalInterface
public interface Math {
public int Calc(int first, int second);
public int Calc2(int first, int second);
Java
복사
6-1 함수형 인터페이스 람다 사용예제
@FunctionalInterface
interface Math {
public int Calc(int first, int second);
}
Java
복사
6-2 추상 메소드 구현 및 함수형 인터페이스 사용
public static void main(String[] args){
Math plusLambda = (first, second) -> first + second;
System.out.println(plusLambda.Calc(4, 2));
Math minusLambda = (first, second) -> first - second;
System.out.println(minusLambda.Calc(4, 2));
Java
복사
7. Java에서 지원하는 java.util.function인터페이스
여기서는 짧게 2가지만 설명하겠습니다.
7-1 IntFunction<R>
•
int 값의 인수를 받아들이고 결과를 생성하는 함수를 나타냄
IntFunction intSum = (x) -> x+1;
System.out.println(intSum.apply(1));
실행결과 : 2
Java
복사
7-2 BinaryOperator<T>
•
동일한 유형의 두 피연산자에 대한 연산을 나타내며 피연산자와 동일하 ㄴ유형의 결과를 생성
BinaryOperator stringSum=(x, y)->x+" "+y;
System.out.println(stringSum.apply("Welcome","Heejin blog"));
실행결과 : Welcome Heejin blog
Java
복사
그외 다양한 Interface 목록
8. StreamAPI
8-1 Stream 이란?
Stream이란 다양한 데이털르 표준화된 방법으로 다루기 위한 라이브러리, 자바 8부터 추가된 Stream API는 다음과 같이 구성
example.stream().filter(x-> x<2).count
steram() : stream생성
filter() : 중간연산( 스트림 변환)-> 연속해서 수행가능
count : 최종연산(스트림 사용) -> 마지막에 단 한번만 사용가능
Java
복사
8-2 Stream의 특징
1.
Stream은 데이터를 변경하지 않습니다.
2.
Stream은 1회용
3.
Stream은 지연 연산 수행
4.
Stream은 병렬 실행 가능
8-3 Stram의 종류
8-4 Stream의 중간 연산 명령어
8-5 Stream의 최종 연산 명령어
8-6 Stream API 간단예제
//Stream API를 이용한 간단한 짝수 판별
IntStream.range(1, 11 ).filter(i-> i%2==0)
.forEach(System.out::println);
실행 결과:
2
4
6
8
10
Java
복사
사용 예제
// 0~1000까지의 값 중 500이상이며 짝수이면서 5의 배수인 수의 합을 구하라
System.out.println(
IntStream.range(0, 1001)
.skip(500)
.filter(i-> i%2==0)
.filter(i-> i%5==0)
.sum()
);
실행 결과:
38250
Java
복사