Notice
Recent Posts
Recent Comments
Link
관리 메뉴

개발자되기 프로젝트

Stream 본문

Java/다양한 기능

Stream

Seung__ 2021. 10. 27. 22:24

1. Stream???


  • 자료의 대상과 관계 없이 동일한 연산을 수행
    • 배열, 컬렉션을 대상으로 연산을 수행
    • 일관성 있는 연산으로 자료의 처리를 쉽고 간단하게 함
    • 자료 처리에 대한 추상화가 구현되어 있음
  • 한 번 생성하고 사용한 스트림은 재 사용 할 수 없음.
    • 자료에 대한 스트림을 생성하여 연산을 수행하면 스트림은 소모됨
    • 다른 연산을 수행하기 위해서는 스트림을 다시 생성해야 함.
  • 스트림 연산은 기존 자료를 변경하지 않음
    • 자료에 대한 스트림을 생성하면 스트림이 사용하는 메모리 공간은 별도로 생성됨.
    • 따라서 연산이 수행되도 기존 자료에 대한 변경은 발생하지 않음
  • 스트림 연산은 중간 연산과 최종 연산으로 구분됨
    • 스트림에 대한 중간 연산은 여러 개의 연산이 적용될 수 있지만
    • 최종 연산은 마지막 한 번만 적용됨
    • 최종 연산이 호출되어야 중간 연산에 대한 수행이 이루어 지고, 그 결과가 만들어짐
    • 따라서 중간 연산에 대한 결과를 연산 중에 알 수 없음.
    • 이를 "지연 연산"이라 함.

 

 

 

2. 중간연산과 최종 연산


  • 중간 연산 : filter(), map(), sorted() 등
    • 조건에 맞는 요소를 추출(filter)하거나 요소를 반환(map)
  • 최종 연산이 호출될 때 중간 연산이 수행되고 결과가 생성 됨
  • 예시)문자열 리스트에서 문자열의 길이가 5이상인 요소만 출력하기
sList.stream().filter(s->s.length() >= 5).forEash(s->System.out.println(s));
  • filter는 중간 연산이고 forEach()가 최종 연산
  • 예시) 고객 클래스 배열에서 고객 이름만 가져오기
customerList.stream().map(c -> c.getName()).forEach(s->Systemout.printlnt(s));
  • map()은 중간 연산이고, forEach()가 최종 연산
  • 중간  연산과 최종 연산에 대한 "구현"은 람다식 활용
  • 최종 연산 - sum(), forEach(), count() 등
  • 최종 연산 이후에! 스트림은 더 이상 다른 연산을 적용할 수 없음.

 

 

 

3. 예시


public class StreamTest {

    public static void main(String[] args) {

        int[] arr = {11, 22, 33, 44};

        //반복문
        System.out.println("반복문 사용");
        for (int num : arr) {
            System.out.println("num = " + num);
        }

        System.out.println("=============================");

        //stream
        System.out.println("stream 사용");
        Arrays.stream(arr).forEach(num -> System.out.println("num = " + num));
    }
}

 

4.  ArrayList, Stream


public class ArrayListStreamTest {

    public static void main(String[] args) {

        List<String> stringList = new ArrayList<>();

        stringList.add("A");
        stringList.add("D");
        stringList.add("B");
        stringList.add("C");


        System.out.println("=====================");
        stringList.stream().forEach(System.out::println);
        System.out.println("=====================");
        stringList.stream().map(s -> s.equals("A")).forEach(System.out::println);
        System.out.println("=====================");
        stringList.stream().filter(s -> s.equals("A")).forEach(System.out::println);
        System.out.println("=====================");
        stringList.stream().sorted().forEach(System.out::println);
        System.out.println("=====================");

    }
}
=====================
A
D
B
C
=====================
true
false
false
false
=====================
A
=====================
A
B
C
D
=====================

 

 

 

5. GitHub : 211027 Stream


 

GitHub - bsh6463/various_functions

Contribute to bsh6463/various_functions development by creating an account on GitHub.

github.com

 

'Java > 다양한 기능' 카테고리의 다른 글

reduce()  (0) 2021.10.28
객체지향 프로그래밍 vs 람다식 구현  (0) 2021.10.27
함수형 인터페이스, 람다식 구현 및 사용  (0) 2021.10.27
람다식  (0) 2021.10.27
익명 내부 클래스 활용  (0) 2021.10.26
Comments