람다식(Lambda Expression)
람다식
(a,b) -> a>b?a:b
함수와 메서드의 차이
- 근본적으로 동일. 함수는 일반적 용어, 메서드는 객체지향개념 용어
- 함수는 클래스에 독립적, 메서드는 클래스에 종속적이다
람다식 작성하기
- 1.메서드의 이름과 반환타입을 제거하고 '->'를 블록{} 앞에 추가한다
- 2.반환값이 있는경우, 식이나 값만 적고 return문 생략 ; 도 생략
- 3.매개변수의 타입이 추론 가능하면 생략가능 (대부분의 경우 생략가능)
람다식 작성 주의사항
- 1.매개변수가 하나인 경우, 괄호() 생략가능(타입이 없을 때만)
- 2.블록 안의 문장이 하나뿐 일 때 , 괄호{} 생략가능
람다식은 익명 객체!
- 람다식은 익명함수가 아니라 익명객체이다
- 람다식(익명객체)를 다루기 위한 참조변수가 필요 참조변수의 타입은?

함수형 인터페이스
함수형 인터페이스
- 단 하나의 추상 메서드만 선언된 인터페이스
- 함수형 인터페이스 타입의 참조변수로 람다식을 참조할 수 있음
- 람다식을 다루기위한 참조변수의 타입은 함수형 인터페이스로 한다
함수형 인터페이스 예제
java.util.funtion패키지01
- 자주 사용되는 다양한 함수형 인터페이스를 제공한다
- java.lang.Runnable , void run() , 매개변수x 반환값x
- Supplier< T > , T get() , 매개변수x 반환값o
- Consumer< T >, void accept< T t >, 매개변수o 반환값x
- Function< T,R >, R apply(T t) , 일반적인 함수 매개변수하나 결과를반환
- Predicate< T >, boolean test(T t), 조건식을 표현하는데 사용됨 매개변수하나 반환타입 boolean
java.util.funtion패키지02
- 매개변수가 2개인 인터페이스는 Bi를 앞에붙인다
- BiConsumer , BiPredicate , BiFunction
- 3개이상의 매개변수를 사용되면 직접 만들어서 사용
java.util.funtion패키지03
- 매개변수의 타입과 반환타입이 일치하는 함수형 인터페이스
- UnaryOperator< T >,Function의 자손 매개변수와 결과의 타입이 같다
- BinaryOperator< T >, BiFunction의 자손 BiFunction과 달리 매개변수와 결과타입이 같다
Predicate의 결합 , CF와 함수형 인터페이스
Predicate의 결합
- and(), or(), negate()로 Predicate를 하나로 결합(default,static,추상 메서드)
- negate() 는 !임
- 등가비교를 위한 Predicate의 작성에는 isEqual()을 사용(static메서드)
컬렉션 프레임웍과 함수형 인터페이스
- 함수형 인터페이스를 사용하는 컬렉션 프레임워크의 메서드(와일드카드 생략)
- removeIf(),replaceAll(),forEach(), compute() .. 등등
메서드 참조, 생성자의 메서드참조
메서드 참조
- 하나의 메서드만 호출하는 람다식은 '메서드참조'로 간단히 할수 있다
- ClassName::method

생성자의 메서드 참조
Supplier< MyClass > s = () -> new MyClass();
Supplier< MyClass > s = MyClass::new;
Function<Integer,MyClass> s = (i) -> new MyClass(i);
Function<Integer, MyClass> s = MyClass::new;
스트림, 스트림의 특징
스트림(Stream)
- 스트림은 데이터의 연속적인 흐름
- 다양한 데이터 소스를 표준화된 방법으로 다루기 위한 것
- jdk1.8에서부터 통일됨
- 스트림 사용3단계 1.스트림만들기 2.중간연산 3.최종연산
- 중간연산, 연산결과가 스트림인 연산 '반복적'으로 적용가능하다
- 최종연산, 연산결과가 스트림이 아닌 연산 '한번만' 적용가능(스트림 요소를 소모)
스트림 특징 01
- ReadOnly, 스트림은 데이터 소스로부터 데이터를 읽기만할 뿐 변경하지 않는다
- 스트림은 Iterator 처럼 일회용이다 (필요하면 다시 스트림을 생성해야 함)
- 최종 연산 전까지 중간연산이 수행되지 않는다
스트림 특징 02
스트림 특징 03
- 스트림의 작업을 병렬로 처리 , 병렬스트림
- 기본형 스트림,
Stream< T > 대신 IntStream,LongStream,DoubleStream ... 사용
오토박싱&언박싱의 비효율이 제거된다 보다 효율적 작업 가능
스트림 만들기
스트림 만들기-컬렉션
- Collection인터페이스의 stream()으로 컬렉션을 스트림으로 변환

스트림 만들기-배열
- 객체 배열로부터 스트림 생성하기

- 기본형 배열로부터 스트림 생성하기

스트림 만들기-임의의 수
- 난수를 요소로 갖는 스트림 생성하기

스트림 만들기-특정범위의 정수
- 특정 범위의 정수를 요소로 갖는 스트림 생성하기(IntStream,LongStream)

스트림 만들기-람다식 iterate(),generate()
- 람다식을 소스로 하는 스트림 생성하기
- iterate()는 이전 요소를 seed로 해서 다음 요소를 계산한다
- generate()는 seed(초기값)를 사용하지 않는다

스트림 만들기-파일과 빈 스트림
Stream<Path> str = Files.list(path dir)
Stream<Path> str = Files.lines(path dir,Charset cs)
- 비어있는 스트림 생성하기,Stream.empty()