람다식
람다람다람쥐?
앞에 제너릭하느라 정신을 빼놔서 드립칠 생각도 못했다... 하
아무튼 람다식은 또 뭐냐 후려처서 말하면 이름이 없는 함수를 표현하기 위한 언어라고 한다.
익명함수, 함수명(메소드명)이 없는 함수를 생성하기 위한 표현식으로 함수형 언어에서 사용하는 함수 표현방법이다
( cf.자바는 객체지향언어! 파이썬은 함수형언어! )
[함수형언어의 특징]
함수를 일급객체로 다룬다....? 그말은 함수를 변수에 넣을 수 있다= 매개변수로 함수를 전달하거나, 함수를 반환 할 수 있다는 뜻 아하!
대신 함수는 순수함수여야함(외부 변수의 영향 받지 않는 함수)
람다식은 인터페이스의 추상 메소드를 간결하게 그리고 하나의 추상 메소드로 여러가지 기능을 갖는 다양한 일회성 익명함수를 구현하는 것이 목적이다
추상 메소드를 하.나.만. 갖는 인터페이스(함수형 인터페이스라 함)가 반.드.시. 필요하다.
@FunctionalInterface로 인터페이스를 만드는 경우, 하나 이상의 추상메소드 정의 시 컴파일 에러가 발생한다
****컬렉션이나 배열의 데이타를 다루고 Stream객체의 메소드 인자로 전달할 때 많이 사용한다 ***
[람다식]
(매개변수들) -> { ... }
람다식은 함수를 간.결.하.게 표현하기 위해 많은 생략 기법을 사용 하다보니 진짜 엄청 간단하네
1.매개변수의 자료형 생략 가능.
2.매개변수가 한 개인 경우 매개변수를 감싸는 괄호를 생략 가능
3.함수 구현부에 명령문이 한 개인 경우 구현부를 감싸는 중괄호 생략 가능
4.함수 구현부에 명령문이 한 개이고 그 명령문이 return문일 경우 return도 생략 가능.
5.매개변수가 없거나 두 개 이상 일 때는 무조건 괄호로 감싸야 한다
Stream
배열이나 컬렉션의 저장된 객체(데이터)를 변경하지 않고 처리하기 위한 라이브러리로 "지연연산"(=Lazy Evaluation )을 수행한다.
음.. 오라클에서 커밋이나 롤백 하기 전에 데이터를 메모리에 임시보관하는 그런느낌???
스트림의 메소드의 인자로 람다식을 전달하면 코드를 훨씬 간결하게 작성 할 수 있다
스트림의 메소드는 "내부 반복"으로 데이타를 처리한다. 즉 for문이나 while문과 같은 반복문을 명시적으로 사용하지 않는다. 우와아아아아
스트림은 한 번 사용하면 닫혀서 다시 사용할 수 없다. 다시 사용하려면 Stream객체를 다시 얻어 와야 한다
Stream는 범용적인 Stream <T> 와 데이터 소스로 기본 자료형을 다루는 IntStream, LongStream, DoubleStream을 제공한다
[스트림 생성 ]: 스트림의 데이터 소스은 주로 배열과 컬렉션(근데 MAP계열은 없어용 )을 사용한다
범용적인 스트림 생성
-컬렉션인 경우
Stream<T> 컬렉션객체.stream() // map은 없어용
-배열인 경우
Stream<T> Stream.of(T[])
Stream<T> Arrays.stream(T[])
Stream<T> Arrays.stream(T[] array, int startInclusive, int endExclusive)
int, long, double과 같은 기본 자료형 배열을 소스로 하는 스트림 생성
IntStream IntStream.of(int...values)
IntStream IntStream.of(int[])
IntStream Arrays.stream(int[])
IntStream Arrays.stream(int[] array, int startInclusive, endExclusive)
****특정 범위의 정수를 소스로하는 스트림 생성 ******** range 많이 씀..........
IntStream IntStream.range(int startInclusive, endExclusive); //끝 숫자 제외
IntStream IntStream.rangeClosed(int startInclusive, endInclusive); //끝 숫자 포함
[스트림의 주요 메소드]
스트림의 메소드는 스트림의 데이터를 변환하는 중간 연산을 하는 메소드와 스트림 데이타를 사용하는 최종연산으로 나눌 수 있다. 중간 연산 메소드는 연속해서 사용이 가능하나 최종 연산 메소드는 사용 후 스트림이 닫히기 때문에 새롭게 스트림을 생성해야 한다.
중간 연산 메소드: (저장 전)
Stream <T> distinct() : Stream의 중복 요소 제거 바로 실행x 지연연산!
Stream <T> sorted([Comparator]) : Stream 요소를 오름차순으로 정렬, 람다식으로 Comparator를 구현하여 오름차순 및 내림차순으로 정렬 할수 있다
Stream <T> filter(Predicate <T> predicate) : 조건에 만족하는 요소를 Stream으로 생성
Stream <T> limit(long maxSize) : maxSize 까지의 요소를 Stream으로 생성
Stream <T> skip(ling n) : n개까지의 요소를 제외하는 stream 생성
Stream <R> map(Function< ? super T, ? extends R> mapper) : 입력 T타입을 R타입 요소로 변환한 스트림 생성
<? extneds T> 요게 T타입을 상속받은 ? 모든 객체들 요런 뜻
map => 변형하는거라 생각!
최종 연산 메소드: 집계(완전 저장)
T reduce ( T identity, BinaryOperator<T> accumulator) : Stream 의 요소를 하나씩 줄여가며 연산.
void forEach(Consumer <? super T> action) : Stream 의 각 요소에 지정된 작업 수행
long count() : Stream 의 요소 개수 반환
Optional <T> sum (Comparator <? super T> comparator) : Stream 의 요소 합 반환
Optional <T> max (Comparator <? super T> comparator) : Stream 요소의 최대 값 반환
Optional <T> min (Comparator <? super T> comparator) : Stream 요소의 최소 값 반환
Optional <T> findAny() : Stream 요소의 랜덤 첫 번째 요소 반환(불안정)
Optional <T> findFirst() : Stream 의 첫 번째 요소 반환(안정적)
스트림은 컬렉션 정렬할 때 슬쩍 맛보기로 대충 하고 넘어 간 적 이 있음! 지금보면 쪼오오오금은 이해 될 거니까 그거 복습하고 오세욤!
CollectionNArraySort 여기랑 또 연결 되어있는게 InnerAnonymousClass 요 부분 공부하면 이해 될 것!!
'학원 > JDBC' 카테고리의 다른 글
10/25 28-8 Stream (0) | 2022.10.25 |
---|---|
10/25 28-7 lambda (1) | 2022.10.25 |
10/25 28-5 Generic 코딩으로 알아보기 (0) | 2022.10.25 |
10/25 28-4 제너릭(Generic) 이론정리 (0) | 2022.10.25 |
10/25 28-3 TransationSQL(트랜젝션처리) (1) | 2022.10.25 |