1. Lambda
- 익명함수를 지칭하는 용어로, 함수를 보다 단순하게 표현하는 방법
 
- 익명함수이기 때문에 함수의 이름이 없으며, 다른 객체들에 적용 가능한 모든 연산을 지원하는 일급객체의 특징을 가짐
 
- 함수를 값으로 사용할 수도 있고, 파라미터로 전달하거나 변수에 대입하는 등의 연산이 가능함
 
2. Lambda의 장단점
2-1. 장점
- 코드의 간결성 : 불필요한 반복문의 삭제가 가능하며, 복잡한 식을 단순하게 표현할 수 있음
 
- 지연연산 수행 : 지연연산을 수행하여 불필요한 연산을 최소화할 수 있음
 
- 병렬처리 기능 : 멀티쓰레딩을 활용, 병렬처리가 가능함
 
2-2. 단점
- 호출이 까다로움
 
- Lambda Stream에서 for문과 while문을 사용하면 성능이 떨어질 수 있음
 
- 불필요하게 너무 사용하면 가독성이 떨어질 수 있음
 
3. Lambda 표현
- 매개변수 화살표(->)를 함수몸체로 사용하여 표현
 
- 함수몸체가 단일 실행문이라면 괄호({})를 생략할 수 있음
 
- 함수몸체가 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(); }
(x, int y) -> x+y
(x, final y) -> x+y  
4. Lambda 예제
new Thread(new Runnable() {
   @Override
   public void run() { 
      System.out.println("Welcome Heejin blog"); 
   }
}).start();
new Thread(()->{
      System.out.println("Welcome Heejin blog");
}).start();
5. 함수형 인터페이스
- @FunctionalInterFace : 구현해야할 추상 메소드 하나만 정의된 인터페이스를 가리키며, 함수형 인테페이스에 두 개 이상의 메소드가 선언되면 오류가 발생함
 
@FunctionalInterface
public interface Math {
    public int Calc(int first, int second);
}
@FunctionalInterface
public interface Math {
    public int Calc(int first, int second);
    public int Calc2(int first, int second);
}
@FunctionalInterface
interface Math {
    public int Calc(int first, int second);
}
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));
}
6. java.util.function 인터페이스
| 종류 | 매개값 | 리턴값 | 메서드형태 | 활용 | 
|---|
| Consumer | O | X | accept() | 소비자, 매개값이 있고, 리턴값이 없음 | 
| Supplier | X | O | get~~~() | 생산자, 매개값이 없고, 리턴값이 있음 | 
| Function | O | O | apply~~~() | 매개값을 매핑(=타입변환)해서 리턴 | 
| Operator | O | O | apply~~~() | 매개값을 연산해서 결과 리턴 | 
| Predicate | O | O | test() | 매개값이 조건에 맞는지 확인해서 boolean 리턴 | 
6-1. IntFunction\
- int형의 인수를 받아들이고 그 결과를 생성함
 
IntFunction intSum = (x) -> x+1;
System.out.println(intSum.apply(1)); 
6-2. BinaryOperator\
BinaryOperator stringSum=(x, y)->x+" "+y;
System.out.println(stringSum.apply("Hello","World")); 
7. Stream API
7-1. Stream이란?
7-2. Stream의 특징
- 1회용으로, 데이터를 변경하지 않음
 
- 지연연산을 수행함
 
- 병렬실행이 가능함
 
7-3. Stream의 종류
| 종류 | 내용 | 
|---|
| Stream \ | 범용 Stream | 
| IntStream | 값 타입이 Int인 Stream | 
| LongStream | 값 타입이 Long인 Stream | 
| DoubleStream | 값 타입이 Double인 Stream | 
7-4. Stream의 중간 연산 명령어
| 종류 | 내용 | 
|---|
| Stream \ distinct() | Stream의 요소 중복 제거 | 
| Stream \ sorted() | Stream 요소 정렬 | 
| Stream \ filter(Predicate \ predicate) | 조건에 충족하는 요소를 Stream으로 생성 | 
| Stream \ limit(long maxSize) | maxSize 까지의 요소를 Stream으로 생성 | 
| Stream \ skip(ling n) | 처음 n개의 요소를 제외하는 stream 생성 | 
| Stream \ peek(Consumer\ action) | T타입 요소에 맞는 작업 수행 | 
| Stream \ flatMap(Function\<T, stream<? extends R>> Tmapper) | T타입 요소를 1:N의 R타입 요소로 변환하여 스트림 생성 | 
| Stream \ map(Function<? super T, ? extends R> mapper) | 입력 T타입을 R타입 요소로 변환한 스트림 생성 | 
| Stream mapToInt(),mapToLong(),mapToDobule() | 만약 map Type이 숫자가 아닌 경우 변환하여 사용 | 
7-5. Stream의 최종 연산 명령어
| 종류 | 내용 | 
|---|
| void forEach(Consumer <? super T> action) | Stream 의 각 요소에 지정된 작업 수행 | 
| long count() | Stream 의 요소 개수 | 
| Optional \ sum (Comparator <? super T> comparator) | Stream 의 요소 합 | 
| Optional \ max (Comparator <? super T> comparator) | Stream 요소의 최대 값 | 
| Optional \ min (Comparator <? super T> comparator) | Stream 요소의 최소 값 | 
| Optional \ findAny() | Stream 요소의 랜덤 요소 | 
| Optional \ findFirst() | Stream 의 첫 번째 요소 | 
| boolean allMatch(Pradicate \ p) | Stream 의 값이 모두 만족하는지 boolean 반환 | 
| boolean anyMatch(Pradicate \ p) | Stream 의 값이 하나라도 만족하는지 boolean 반환 | 
| boolean noneMatch(Pradicate \ p) | Stream 의 값이 하나라도 만족하지않는지 boolean 반환 | 
| Object[] toArray() | Stream 의 모든 요소를 배열로 반환 | 
7-6. reduce 연산
| 종류 | 내용 | 
|---|
| Optional \ reduce(Binary Operator\ accumulator) | .reduce((x,y) -> x > y ? x : y ); | 
| T reduce ( T identity, BinaryOperator\ accumulator) | .reduce(1, (x,y) -> x * y); | 
| \ U reduce (U indentity, BiFunction\<U, ? super T, U> accumulator, BinaryOperator\ combiner) | .reduce(0.0, (val1, val2) -> Double.valueOf(val1 + val2 / 10), (val1, val2) -> val1 + val2); | 
7-7. Stream API 예제
IntStream.range(1, 11 ).filter(i-> i%2==0)
      .forEach(System.out::println); 
System.out.println(
      IntStream.range(0, 1001)
            .skip(500)
            .filter(i-> i%2==0)
            .filter(i-> i%5==0)
            .sum()
);
import java.util.*;
import java.util.stream.Collectors;
int[] array = list.stream().mapToInt(i->i).toArray();
List<Integer> list = Arrays.stream(array).boxed().collect(Collectors.toList());