람다와 스트림
함수형 언어!!
람다와 스트림
람다식(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으로 전환
스트림 만들기 - 배열
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