Laguage/Java

람다와 스트림

sandbackend 2022. 10. 25. 01:16

함수형 언어!! 

 

람다와 스트림

 

람다식(Lambda Expression)

- 함수를 간단한 식으로 표현하는 방법ㄴ

반환타임하고 이름을 지움

-> 람다식 작성하는 방법

 

함수는 클래스에 독립적, 메서드는 클래스에 종속적 ==> 그래서 자바에는 메서드 밖에 없음

 

 

작성시 주의사항

- 매겨변수가 하나인 경우 괄호 생략 가능 ( 타입이 없을 때만)

- 문장이 하나 뿐 일 때, 괄호 생략가능

 

예시)

(a, b) -> a > b ? a : b;

 

(name, i) -> System.out.println(name + "=" + i)

 

x -> x * x

 

() -> (int)*Math.random * 6)

 

 

 

익명클래스 익명객체 객체의 선언과 생성이 동시에

참조변수가 필요함

// 

Myfuntion f= new Myfuntion() {

public int max(int a, int b) {

return a > b ? a : b;

}

};

 

// 람다식을 다루기 위한 참조변수의 타입은 함수형 인터페이스로 한다.

Myfuntion f= (a, b) -> a > b ? a : b;

int value = f.max(3,5); // 함수형 인터페이스

 

함수형 인터페이스

- 단 하나의 추상 메서드만  선언된 인터페이스

@FuntionalInterface  // 함수형 인터페이스는 단 하나의 추상메서드만 가져야 함.

interface Myfuntion {

public abstract int max(int a, int b)

}

 

Collections.sort(list, (s1,s2) -> s2.compareTo(s1));

 

 

 

 

 

스트림(Stream)

- 다양한 데이터 소스를 표준화된 방법으로 다루기 위한 것

--> 통일 성공

컬렉션 프레임워크 : 리스트 셋 맵 --> 얘는 통일 실패

 

스트림 작업 처리하기 3단계

1. 스트림만들기

2. 중간연산 : 여러번가능

3. 최종연산 : 1번

ex)

steam.distinct().limit(5).sorted().forEach(System.out::println)

           중복제거 자르기정렬       출력(최종연산)

 

스트림 = 데이터의 연속적인 흐름

 

스트림은 일회용이다. 다시 생성해야함

 

 

유한 스트림, 무한 스트림

지연된 연산

 

 

반복을 내부 반복으로 처리한다 forEach  : 성능은 떨어지지만 코드가 간결해짐

 

병렬 스트림, 멀티쓰레드, 빅데이터, parallel()

 

기본형 스트림   IntStream, LongStream, DoubleStream

Stream<integer> -- > IntStream 으로 바꿔서 써라

**안써도 되는데 속도가 너무 느리다 싶으면 쓰라.

 

기본형에서 참조형으로 바뀜 ===> 오토박싱

 

 

 

 

스트림 만들기 - 컬렉션

컬렉션으로 부터 스트림 만드는 방법

Stram<E> stream()

Stream<Integet> intStream = list.stream(); // 리스트를 stream으로 전환

 

 

스트림 만들기 - 배열

S

String[] strArr = new String[] {"a","b","c","d"}

Stream<String> strStream =  Stream.of(strArr)

// Stream<String> strStream =  Arrays.stream(strArr)

strStream.forEach(System.out::println);

 

int[] intArr = {1,2,3,4,5};

IntStram intStram = Arrays.stream(intArr);

 

intStream .count

.sum

.average