728x90
스트림 생성
스트림 사용 시 주의할 점
- 데이터 소스로부터 데이터를 읽기만 하고 변경은 하지 않는다
- 스트림은 일회용이다. -> 한번 사용 시 닫히므로 필요시 다시 만들어야 됨
Collection 인터페이스에는 stream()이 정의되어 있다
-> Collection을 구현한 객체들(List, Set 등)은 모두 stream()을 이용해 스트림을 생성할 수 있다
.stream()
// List로부터 스트림을 생성
List<String> list = Arrays.asList("a", "b", "c"); // List생성
Stream<String> listStream = list.stream(); // List로 Stream을 생성
listStream.forEach(System.out::prinln); //스트림의 모든 요소를 출력.
배열
Arrays.stream()
Stream<String> stream = Stream.of("a", "b", "c");
Stream<String> stream = Stream.of(new String[] {"a", "b", "c"});
Stream<String> stream = Arrays.stream(new String[] {"a", "b", "c"});
Stream<String> stream = Arrays.stream(new String[] {"a", "b", "c"}, 0, 3);
원시 자료형 (int, long, double)
특수한 종류의 Stream들도 사용 가능 (IntStream, LongStream, DoubleStream)
리턴 타입 | 메서드(매개 변수) | 소스 |
Stream, IntStream, LongStream, DoubleStream |
Arrays.stream(T[]), Arrays.stream(int[]), Arrays.stream(long[]), Arrays.stream(double[]), Stream.of(T[]), IntStream.of(int[]) LongStream.of(long[]), DoubleStream.of(double[]) | 배열 |
IntStream | IntStream.range(int, int), IntStream.rangeClosed(int, int) | int 범위 |
LongStream | LongStream.range(long, long), LongStream.rangeClosed(long, long) | long 범위 |
Stream | java.util.Collection.Stream(), java.util.Collection.parallelSream( ) | 컬렉션 |
IntStream의 경우 range() 이용 가능
// 4이상 10미만의 숫자를 갖는 IntStream
IntStream stream = IntStream.range(4, 10);
중간 연산
중간 연산은 연산 결과를 스트림으로 반환하기 때문에, 연속해서 여러 번 수행 가능
메서드 | 설명 |
filter() | 조건에 맞는 데이터만을 정제해여 더 작은 컬렉션을 만들어준다. |
distinct() | 중복 요소 제거 |
map() | 기존의 Stream 요소들을 대체하는 요소로 구성된 새로운 Stream을 형성(인자로 함수형 인터페이스 function을 받는다) |
sorted() | 정렬 (인자x = 오름차순, Comparator.reverseOrder() = 내림차순) |
peek() | 요소를 하나씩 돌면서 출력 (스트림을 소모하지 않음) -> 주로 연산 중간에 결과를 확인하기 위해 사용 |
최종 연산
최종 연산은 연산 결과가 스트림이 아니기 때문에, 한 번만 연산이 가능하다
메서드 | 설명 |
forEach() | 연산 결과 확인 |
allMatch() | 모든 요소가 조건을 만족할 경우 true |
anyMatch() | 하나 이상의 요소가 조건을 만족할 경우 true |
noneMatch() | 모든 요소가 조건을 만족하지 못할 경우 true |
sum() | 전체 요소의 합 |
count() | 전체 요소의 개수 |
average() | 전체 요소의 평균값 |
max() | 최대값 |
min() | 최소값 |
findFirst() | 배열의 첫번째 요소 |
reduce() | 누적하여 하나로 응축(reduce)하는 방식으로 동작. 앞의 두 요소의 연산결과를 바탕으로 다음 요소와 연산한다 |
collect() | List나 Set, Map 등 다른 종류의 결과로 수집하고 싶은 경우 |
reduce() 예시
int[] intArr = {1, 2, 3, 4, 5};
long example1 = Arrays.stream(intArr).sum();
System.out.println("intArr의 전체 요소 합 " + example1);
int example2 = Arrays.stream(intArr)
.reduce((a, b) -> a - b)
.getAsInt();
System.out.println("초기값 없는 reduce " + example2);
int example3 = Arrays.stream(intArr)
.reduce(10, (a, b) -> a - b);
System.out.println("초기값 존재하는 reduce " + example3);
728x90
'개발일지 > Java' 카테고리의 다른 글
Java InputStream, OutputStream (0) | 2022.09.24 |
---|---|
Java Optional<T> (0) | 2022.09.24 |
Java 스트림(Stream) (0) | 2022.09.19 |
Java 람다식 (Lambda Expression (0) | 2022.09.19 |
Java 애너테이션 (Annotation) (0) | 2022.09.19 |