본문 바로가기
Backend/JAVA

[JAVA] 자바 Stream 중간 연산 및 스트림 만들기

by couque 2023. 12. 28.
반응형

자바에서 스트림 생성과 중간연산에 대한 예제 입니다.

 

Stream은 생성부터 중간 연산과 최종 연산이 있는데

중간연산의 경우, Stream을 반환해 주기 때문에 여러번 연산이 가능하고

최종연산의 경우, Stream이 닫히기 때문에 한번만 연산이 가능합니다.

 

만약 최종연산 후 해당 스트림을 다시 사용하는 경우 에러가 발생합니다.

 

아래 예제들을 보면 스트림 사용방법을 이해할 수 있을 것 같습니다.


지정된 범위의 Stream 생성하기

 

# range와 rangeClosed

IntStream intStream = IntStream.range(0, 10);
intStream.forEach(System.out::print);  //0123456789

IntStream intStream2 = IntStream.rangeClosed(0, 10);
intStream2.forEach(System.out::print);  //012345678910

 

# iterate

Stream<String> stream = Stream.iterate(0, n->n+2);
stream.limit(10).forEach(System.out::print);  //024681012141618

 

# random

IntStream intStream = new Random().ints(0, 100);  // 무한스트림
intStream
    .limit(5)
    .forEach(System.out::println);  //40 81 28 34 50 (0~100사이의 5개 난수 생성)

IntStream intStream2 = new Random().ints(5);
intStream2.forEach(System.out::println);  //298349357... (5개 난수 생성)

 

 

Stream 중간 연산

 

# distinct

String[] arr = {"A","B","C","D","E","B","C","D"};

Stream<String> stream = Stream.of(arr);

stream.distinct().forEach(System.out::print);  // ABCDE

 

# sorted

String[] arr = {"A","B","C","D","E","B","C","D"};

Stream<String> stream = Stream.of(arr);
// 아래 스트림은 최종 스트림을 사용하여 닫히기 때문에 하나씩 실행해야함 (나머지 주석처리)

//정렬
stream.sorted().forEach(System.out::print);  // ABBCCDDE

//역순으로 정렬
stream.sorted(Comparator.reverseOrder()).forEach(System.out::print);  // EDDCCBBA

 

String[] arr = {"A","D","c","b","e","F","g","H"};

Stream<String> stream = Stream.of(arr);

// String.CASE_INSENSITIVE_ORDER로 sort 하는 경우 대소문자 구분 안함
stream.sorted(String.CASE_INSENSITIVE_ORDER).forEach(System.out::print);  // AbcDeFgH

 

String[] arr = {"AA","DDDD","eee","bbbbb","ccc"};

Stream<String> stream = Stream.of(arr);
// 아래 스트림은 최종 스트림을 사용하여 닫히기 때문에 하나씩 실행해야함 (나머지 주석처리)

// 문자열 길이 순으로 정렬
stream.sorted(Comparator.comparing(String::length)).forEach(System.out::print);  // AAeeecccDDDDbbbbb

// 문자열 길이 역순으로 정렬
stream.sorted(Comparator.comparing(String::length).reversed()).forEach(System.out::print);  // bbbbbDDDDccceeeAA

// 추가정렬기준 (문자열 길이 순 and 대소문자구분없이 정렬)
stream.sorted(Comparator.comparing(String::length).thenComparing(String.CASE_INSENSITIVE_ORDER)).forEach(System.out::print);  // AAccceeeDDDDbbbbb

 

# skip, limit

IntStream intStream = IntStream.range(0, 10);
stream.skip(3).limit(6).forEach(System.out::print);  // 345678

 

# filter

IntStream intStream = IntStream.range(0, 10);
stream.filter(n->n%2 != 0).forEach(System.out::print);  // 13579
IntStream intStream = IntStream.range(0, 10);
stream.filter(n -> n>2 && n<7).forEach(System.out::print);  // 3456

 

# map

String[] arr = {"abc.jpg","def.png","ghijk","lmno.txt","stUVWxyZ"};

Stream<String> stream = Stream.of(arr);

//확장자가 있는 값만 구하기
stream.filter(n->n.indexOf(".") != -1).forEach(System.out::print);  // abc.jpgdef.pnglmno.txt

//확장자 구하기
stream.filter(n->n.indexOf(".") != -1).map(n->n.substring(n.indexOf(".")+1)).forEach(System.out::print);  // jpgpngtxt

 

Stream<String> stream = Stream.of("abCDEfGhijKL");

//대문자로 변환
stream.map(String::toUpperCase).forEach(System.out::print);  // ABCDEFGHIJKL

//소문자로 변환
stream.map(String::toLowerCase).forEach(System.out::print);  // abcdefghijkl

 

# peek

String[] arr = {"abc.jpg", "def.png", "ghijk", "lmno.txt", "stUVWxyZ"};

Stream<String> stream = Stream.of(arr);

//중간연산 중에 값 확인하기
stream.filter(n->n.indexOf(".") != -1)
      .peek(n->System.out.printf("peek:%s%n ", n))  // peek:abc.jpgpeek:def.pngpeek:lmno.txt
      .forEach(System.out::print);

 

 

반응형

댓글