반응형
자바에서 스트림 생성과 중간연산에 대한 예제 입니다.
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);
반응형
'Backend > JAVA' 카테고리의 다른 글
[JAVA] 자바 Stream 기본적인 몇가지 예제 (0) | 2023.12.14 |
---|---|
[JAVA] jsp에서 보낸 json 데이터 java controller에서 변환하기 (0) | 2023.10.24 |
[JAVA] RequestDispatcher forward - 페이지 이동 시키기 (0) | 2023.07.19 |
[JAVA] 자바 객체를 XML로 변환하기 - JAXB(자바API)를 사용하여 dto를 xml로 변환 (marshaller) (0) | 2023.06.23 |
[JAVA] 자바 json 문자열로 변환하기 (0) | 2023.05.01 |
댓글