개발일지/Java

Java 스트림 생성, 중간 연산, 최종 연산

E-room 2022. 9. 20. 12:02
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