수학적 함수의 계산을 통해 자료를 처리하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임
Java 8부터 Optional과 람다식과 같은 함수형 프로그래밍과 비동기 논블로킹의 기능 도입
병렬 처리, 이벤트 지향 프로그래밍에 적합
2000년대 초반까지는 CPU 클럭 증가, 실행 시간 최적화, Cache 크기 증가를 통해 소프트웨어의 싱글 프로세스, 싱글 스레드의 속도가 공짜로 증가했다. 하지만 전력 소모 및 발열 문제 등으로 단일코어를 통한 CPU 클럭 증가는 현실적으로 향상시키기 어려워졌다.
이를 대안으로 코어 수를 늘려서 CPU 의 성능을 향상시키는 방법이 등장했다. 여기서 동시에 제대로 기능을 수행하는 동시성의 개념이 중요해졌고, 절차 기반 언어의 동시성은 주어진 순간에 상태가 변경될 수 있으나 함수형 프로그래밍은 동시성을 통해 CPU 모든 코어를 활용할 수 있다는 특징 때문에 함수형 프로그래밍이 주목받기 시작했다.
sum(a,b) = a+b 값을 반환하는 함수
함수를 호출하면 항상 항상 같은 값 반환
전역 변수나 임의의 종류의 활동과 같이 함수가 제어하지 않는 상태에 의존하지 않음
함수에 정의되지 않은 변수에 접근할 수 없음
무엇
을 할 것인지를 중심적으로 생각// 스트림을 이용해서 짝수만 출력
integerList.stream()
.mapToInt(i -> i)
.filter(i -> i % 2 == 0)
.forEach(i -> System.out.print(i + ", "));
for, while, Iterator
등을 통해 각 요소를 접근하고 원하는 데이터만 추출하여 출력 및 반환어떻게
할 것인지를 중심적으로 생각리턴타입 | 메소드 (매개변수) | 소스 |
---|---|---|
Stream | java.util.Collection.stream(), | 컬렉션 |
java.util.Collection.parallelStream() | 컬렉션 | |
Stream | Arrays.stream(T[]), Stream.of(T[]) | 배열 |
IntStream | Arrays.stream(int[]), IntStream.of(int[]) | 배열 |
LongStream | Arrays.stream(long[]), LongStream.of(long[]) | 배열 |
DoubleStream | Arrays.stream(double[]), DoubleStream.of(double[]) | 배열 |
IntStream | IntStream.range(int, int) | int 범위 |
IntStream.rangeClosed(int, int) | int 범위 | |
LongStream | LongStream.range(long, long) | long 범위 |
LongStream.rangeClosed(long, long) | long 범위 | |
Stream | Files.find(Path, int, BiPredicate, FileVisitOption) | 디렉토리 |
Files.list(Path) | 디렉토리 | |
Stream | Files.lines(Path, Charset) | 파일 |
BufferedReader.lines() | 파일 | |
DoubleStream | Random.doubles(…) | 랜덤 수 |
IntStream | Random.ints(…) | 랜덤 수 |
LongStream | Random.longs(…) | 랜덤 수 |
reduction
이라고 함합계, 평균값, 카운팅, 최대값, 최소
값 등이 대표적인 리덕션 결과물필터링, 매핑, 정렬, 그룹핑
등의 필요함필터링, 매핑, 정렬
이 되는 것이 아니라 최종 처리 시작되기 전까지 중간 처리는 지연 lazy
되었다가 최종 처리가 시작하면 컬렉션 요소가 하나씩 중간 스트림에서 처리되고 최종 처리까지 오게 됨filter, distinct
flatMapXXX, mapXXX, asDoubleStream(), asLongStream, boxed()
sorted
peek
OptionalXXX
allMatch, anyMatch, noneMatch
count, max, min, average, sum, findFirst
reduce
collect
forEach