컴퓨터는 잘못이 없다..

[JAVA]스트림 본문

공부/JAVA

[JAVA]스트림

도토리까꿍v 2024. 4. 27. 11:00
Contents 접기

#핵심 요약

  1. 스트림이란? (Stream)
    • 배열, 컬렉션 등의 데이터를 하나씩 참조하여 처리 가능한 기능
    • for문의 사용을 줄여 코드를 간결하게 함
    • 스트림은 크게 3가지로 구성
      •  Stream생성/중개연산/최종연산  ex. 데이터소스객체.Stream생성().중개연산().최종연산();
  2. 스트림 생성
    • 배열 스트림
    • 컬렉션 스트림
    • 스트림 builder
    • 스트림 generate
    • 스트림 iterator
    • 기본 타입 스트림
  3. 스트림 중개연산
    • Filtering
    • Mapping 
    • Sorting
  4. 스트림 최종연산
    • Sum, Average
    • Min, Max
    • reduce
    • forEach

# 소스 코드

스트림 기본 예제

// Java 프로그래밍 - 스트림

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.OptionalInt;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class Main {

    public static void main(String[] args) {

//      1. 스트림 생성

//      1-1. 배열 스트림
        System.out.println("== 배열 스트림 == ");
        String[] arr = new String[]{"a", "b", "c"};

        //배열 출력하는 방법 -1
        System.out.println("== fori ==");
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }

        //배열 출력하는 방법 -2
        System.out.println("== forEach ==");
        for (String item: arr) {
            System.out.println(item);
        }

        //배열 출력하는 방법 -3 : Stream으로 배열 출력하는 방법
        System.out.println("== Stream ==");
        Stream stream1 = Arrays.stream(arr); //배열을 stream으로 변환
        stream1.forEach(System.out::println);

//      1-2. 컬렉션 스트림
        System.out.println("== 컬렉션 스트림 ==");
        ArrayList list1 = new ArrayList(Arrays.asList(1, 2, 3));
        System.out.println("list1 = " + list1);

        Stream stream2 = list1.stream(); //list1을 stream으로 변환
        stream2.forEach(System.out::println); //stream의 경우 최종연산을 만나면 더이상 연산 수행 불가하다. (forEach도 최종연산 중 하나)
//        stream2.forEach(num -> System.out.println("num = " + num)); //stream + 람다식으로 배열 출력

//      1-3. 스트림 builder
        System.out.println("== 스트림 builder ==");
        Stream streamBuild = Stream.builder().add("a").add("b").add("c").build(); //add로 데이터 추가, build()로 추가한 데이터를 stream으로 만들어줌
        streamBuild.forEach(System.out::println);


//      1-4. 스트림 generate
        System.out.println("== 스트림 generate ==");
        Stream streamGenerate = Stream.generate( () -> "abc" ).limit(3);
        streamGenerate.forEach(System.out::println);
        /*
        * 1. () -> "abc" :  만들어줄 데이터를 왼쪽처럼 표현
        * 2. limit(숫자) : 데이터를 숫자만큼 반복해서 만들겠다.
        * 결과
        * abc
        * abc
        * abc
        * */


//      1-5. 스트림 iterate
        System.out.println("== 스트림 iterate ==");
        Stream streamIterate = Stream.iterate(10, n -> n * 2).limit(3);
        streamIterate.forEach(System.out::println);
        /*
         * 1. 10, n -> n * 2 :  10은 최초 값, 그 다음 값은 10*2, 그 다음 값은 10*2*2 으로 데이터를 만들겠다.
         * 2. limit(숫자) : 데이터를 숫자만큼 반복해서 만들겠다.
         * 결과
         * 10
         * 20
         * 40
         * */


//      1-6. 기본 타입 스트림
        System.out.println("== 기본타입 스트림 ==");
        IntStream intStream = IntStream.range(1, 5); //1~4까지 데이터 생성
        //IntStream intStream = IntStream.rangeClosed(1, 5); //1~5까지 데이터 생성
        intStream.forEach(System.out::println);


//      2. 스트림 중개 연산

//      2-1. Filtering
        System.out.println("== Filtering ==");
        IntStream intStream2 = IntStream.range(1, 10).filter(n -> n % 2 == 0);
        intStream2.forEach(System.out::println);
        /*
         * 1. IntStream.range(1, 10) :  1에서 9까지 데이터를 만들겠다.
         * 2. .filter(n -> n % 2 == 0); : 짝수값만 필터링
         * 필터링은 만들어진 데이터를 조건에 맞게 솎아주는 느낌
         * 결과
         * 2
         * 4
         * 6
         * 8
         * */

//      2-2. Mapping
        System.out.println("== Mapping ==");
        IntStream intStream3 = IntStream.range(1, 10).map(n -> n + 1);
        intStream3.forEach(n -> System.out.print(n + " "));
        System.out.println();
        /*
         * 1. IntStream.range(1, 10) :  1에서 9까지 데이터를 만들겠다.
         * 2. .map(n -> n + 1); : 1씩 더해줌
         * 맵은 만들어진 데이터를 조건에 맞게 다시 만들어주는 느낌
         * 결과
         * 2 3 4 5 6 7 8 9 10
         * */


//      2-3. Sorting : 만들어진 데이터를 오름차순으로 sorting
        System.out.println("== Sorting ==");
        IntStream intStream4 = IntStream.builder().add(5).add(1).add(3).add(4).add(2).build();
        IntStream intStreamSort = intStream4.sorted();
        intStreamSort.forEach(System.out::println);


//      3. 최종 연산

//      3-1. Sum, Average
        System.out.println("== sum, average ==");
        int sum = IntStream.range(1, 5).sum(); //1에서 4까지의 데이터를 더해줌
        double average = IntStream.range(1, 5).average().getAsDouble(); // 1에서 4까지의 데이터를 더해서 평균을 알려줌 getAsDouble은 Double타입의 데이터를 만들어주는 역할

        System.out.println(sum); // 10
        System.out.println(average); //2.5


//      3-2. Min, Max
        System.out.println("== min, max ==");
        int min = IntStream.range(1, 5).min().getAsInt(); //1에서 4까지의 데이터중 최소값
        int max = IntStream.range(1, 5).max().getAsInt(); //1에서 4까지의 데이터중 최대값
        System.out.println(min); //1
        System.out.println(max); //4


//      3-3. reduce
        System.out.println("== reduce ==");
        Stream<Integer> stream3 = new ArrayList(Arrays.asList(1, 2, 3, 4, 5)).stream();
        System.out.println(stream3.reduce((x, y) -> x + y).get()); //15
        /*
        * 1. ArrayList list1 = new ArrayList(Arrays.asList(1, 2, 3, 4, 5));
        * 2. Stream<Integer> stream3 = list1.stream();
        * 위 2개 줄을 한줄로 줄이면 아래와 같이 쓸 수 있음
        * Stream<Integer> stream3 = new ArrayList(Arrays.asList(1, 2, 3, 4, 5)).stream();
        *
        * stream3.reduce((x, y) -> x + y).get() 의미
        * 1,2,3,4,5
        * 1과 2를 더해서 3, 3을 3과 더해서 6, 6과 4를 더해서 10, 10을 5와 더해서 15
        * 이런식으로 연쇄적으로 더해서 데이터를 만들어준다.
        * */


//      3-4. forEach
        System.out.println("== forEach == ");
        //1에서 9까지 데이터 만들어주고 -> 5인 데이터 필터링 -> forEach문으로 출력
        IntStream.range(1, 10).filter(n -> n == 5).forEach(System.out::println);


    }
}

 

스트림 연습 문제

// Practice
// 하기 예제를 스트림으로 구현해보세요.

import java.util.stream.IntStream;

public class Practice {
    public static void main(String[] args) {

        // 예제: 1~10 숫자 중 짝수 들의 합
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        int sum = 0;

        for (int num: arr) {
            if (num % 2 == 0) {
                sum += num;
            }
        }
        System.out.println("sum = " + sum);


        // 위의 코드를 스트림으로 구현하면 더 간결하게 끝난다.
        int sum2 = IntStream.range(1, 11).filter(x -> x % 2 == 0).sum();
        System.out.println("sum2 = " + sum2);

        // 위의 코드를 sout 안에 넣어주면 한 줄에도 끝난다.
        System.out.println("sum2 = " + IntStream.range(1, 11).filter(x -> x % 2 == 0).sum());

    }
}

 

'공부 > JAVA' 카테고리의 다른 글

[JAVA]JAVA 인텔리제이 설정  (0) 2024.04.27
[JAVA]람다식  (1) 2024.04.27
[JAVA]컬렉션 프레임워크  (0) 2024.04.21
Comments