Java/기본

[java] Stream api 사용하기 - 01

vmpo 2021. 9. 14. 18:55

 

java 1.8부터 사용가능한 stream api 를 사용해보도록 하겠습니다.

 

스트림의 경우 기본적으로 아래 순서로 진행됩니다.

stream 생성 ->중간연산(여러번 가능, stream을 반환함)  -> 최종연산

-> 대상컬렉션.stream().중간연산.최종연산

 

1. stream으로 List의 데이터 출력하기

strings 변수명으로 생성된 List를 출력하는 구문입니다.

중간 연산없이 바로 최종연산으로 데이터를 출력합니다.

    //데이터 초기화
    List<String> strings = new ArrayList(){{
      add("A");
      add("B");
      add("C");
      add("d");
    }};
    strings.stream().forEach(System.out::println);

전체 데이터가 출력된 것을 알 수 있음.

 

* 여기서 stream() 을 생성하고 최종연산을 한경우, 해당 strem을 다시 사용할 수 없음.

아래와 같이 Stream<String> 을 생성한 후 strStream에 대해 최종연산을 2번 진행하면 2번째 진행하는 연산에서 오류가 발생함.

    //데이터 초기화
    List<String> strings = new ArrayList(){{
      add("A");
      add("B");
      add("C");
      add("d");
    }};

    Stream<String> strStream = strings.stream();
    strStream.forEach(System.out::println);
    //아래 구문은 오류 발생
    strStream.forEach(System.out::println);

exception 발생

->

 

2.  기본형 배열을 stream으로 변환하기

 

기본 형 스트링 배열을 선언 하고(String[])  해당 배열을 스트림으로 변환한 결과이다. 

Arrays.stream() 을 통해 스트림 변환이 가능하다.

    String[] abc = {"a","b","c"};
    Stream<String> stream = Arrays.stream(abc);
    stream.forEach(System.out::println);

 

3.   기본형 타입의 스트림

무한 스트림을 생성할 경우에는 사이즈제한을 무조건 해줘야 한다.

 

특정 범위

-> IntStream.range(1, 5) //끝 자리 숫자 포함하지 않음

-> IntStream.rangeClosed(1, 5); //끝 자리 숫자 포함.

    System.out.println("IntStream 출력");
    IntStream intStream1 = IntStream.range(1, 5); //[1,2,3,4] 5를 포함하지 않음
    IntStream intStream2 = IntStream.rangeClosed(1, 5); //[1,2,3,4,5] 5를 포함
    IntStream intStream3 = new Random().ints(); //무한 스트림 생성( 무한으로 임의의 숫자가 생성됨)
    intStream3.limit(5).forEach(System.out::println); //무한 스트림을 출력할때는 limit으로 사이즈 제한을 해줘야함.

    //Long type도 가능함.
    System.out.println("LongStream 출력");
    LongStream longStream = LongStream.rangeClosed(1, 5); // [1, 2, 3, 4, 5]
    longStream.forEach(System.out::println);

 

4.  Stream 생성  iterate , generate

    //연산가능!
    Stream<Integer> stream = Stream.iterate(0,n->n+4);
    //stream.forEach(System.out::println); //무한 스트림 발생 ( 출력하면 무한히 계속 실행됨)
    stream.limit(5).forEach(System.out::println); //limit 으로 제한 [0,4,8,12,16]

    //파라미터는 없고 출력만함!
    Stream<Integer> gen = Stream.generate(()-> 10);
    gen.limit(5).forEach(System.out::println);//[10,10,10,10,10]

 

 

 

 

LIST