Algorithms

JAVA Stream

유영서 2023. 7. 9. 10:47

지난번에 JAVA Stream에 대한 정의를 살펴보았고, 오늘은 실제 사용 코드와 기능들에 대해 정리할 것이다

 

1. 스트림 생성

1.1 컬렉션

Collection에 stream() 이 정의되어 있으므로 Collection의 자손인 List와 Set을 구현한 클래스들은 모두 stream()으로 생성가능

Stream<T> Collection.stream()

// List로부터 스트림 생성
List<Integer> list = Arrays.asList(1,2,3,4,5);
Stream<Integer> intStream = list.stream();  // list를 소스로 하는 컬렉션 생성

 

1.2 배열

 Stream과 Arrays에 static메서드로 정의되어 있다.

Stream<T> Stream.of(T... values)  // 가변 인자
Stream<T> Stream.of(T[])
Stream<T> Arrays.stream(T[])
Stream<T> Arrays.stream(T[] array, int startInclusive, int endExclusive)

ex) 문자열 스트림

Stream<String> strStream = Stream.of("a","b","c"); // 가변인자
Stream<String> strStream = Stream.of(new String[]{"a","b","c"});
Stream<String> strStream = Arrays.stream(new String[]{"a","b","c"});
Stream<String> strStream = Arrays.stream(new String[]{"a","b","c"}, 0, 3);

int, long, double과 같은 기본형 배열을 소스로 하는 스트림 생성도 가능

IntStream IntStream.of(int...values)

이런 식으로!

 

1.3 특정 범위의 정수

IntStream intStream = IntStream.range(1, 5);      // 1,2,3,4
IntStream intStream = IntStream.rangeClosed(1, 5) // 1,2,3,4,5

 

...

 

이 외에도 임의의 수, 람다식, 빈스트림 등으로 생성 가능하다. 이와 관련된 정보는 앞의 게시물 출처에 나와있으니 참고해야지! 

 

 

2. 스트림 중간 연산

2.1 스트림 자르기

Stream skip(long n) // 처음 n개의 요소 건너뛰기
Strema limit(long maxSize) // 스트림의 요소를 maxSize개로 제한

 

2.2 스트림 요소 걸러내기

distinct()는 스트림에서 중복된 요소들 제거
filter()는 주어진 조건(Predicate)에 맞지 않는 요소를 걸러낸다.

// distinct()
IntStream exampleStream = IntStream.of(1,2,2,3,3,3,4,5,5,6);
exampleStream.distinct().forEach(System.out::print);  // 123456

// filter()
IntStream example2Stream = IntStream.rangeClosed(1, 10);
example2Stream.filter(i -> i%2 ==0).forEach(System.out::print); // 246810

// filter()를 다른 조건으로 여러 번 사용. 두 문장의 결과는 같다.
example2Stream.filter(i -> i%2!=0 && i%3!=0).forEach(System.out::print);  //157
example2Stream.filter(i -> i%2!=0).filter(i -> i%3!=0).forEach(System.out::print);

 

2.3 스트림 정렬

Stream sorted()
Stream sorted(Comparator<? super T> comparator)

Stream<String> strStream = Stream.of("dd","aaa","CC","cc","b");
strStream.sorted().forEach(System.out::print); // CCaaabccdd

// 기본정렬 역순
strStream.sorted(Comparator.reverseOrder());

// 대소문자 구분 없이
strStream.sorted(String.CASE_INSESITIVE_ORDER)

// 길이 순 정렬
strStream.sorted(Comparator.comparing(String::length))

//정렬 조건을 추가할 때는 thenComparing() 사용
studentStream.sorted(Comparator.comparing(Student::getBan)
                      .thenComparing(Student::getTotalScore)
                      .thenComparing(Student::getName)
                      .forEach(System.out::println);

 

return IntStream.rangeClosed(0, n).filter(value -> value % 2 == 1).toArray();

이 Stream 문법을 적용하고 이 코드를 보면,

기본형 정수 배열을 소스로 한 stream에서 0부터 n까지의 정수를 다루는데 filter 메소드를 사용하여 값이 홀수인 것을 추출하여 배열로 다시 만드는 코드임을 알 수 있다!