[자바의정석]Java - 람다&스트림 #015

람다식(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()

좋은 웹페이지 즐겨찾기