java Stream

메타플랫폼대표
|2024. 5. 29. 10:18
반응형

Stream을 사용하는 이유

- 아래와 같이 배열이 하나 있는데, 중복값 제거, sort로 정렬, 5의 배수만 출력하는데, 이런 과정이 필요하다.

public class MyMain_TestStream {

	public static void main(String[] args) {
		
		int [] arr = {1, 5, 8, 15, 5, 10, 20, 10, 9, 25};
		
		// 1. 중복값을 제거
		Set<Integer> set1 = new HashSet<Integer>();
		for(int n : arr) {
			set1.add(n);
		}
		System.out.println(set1);

		// 2. Set -> Array로 빼냄
		Integer [] arr1 = new Integer[set1.size()];
		set1.toArray(arr1);
		
		// 3. 정렬
		Arrays.sort(arr1);
		for(int n : arr1) {
			System.out.print(n + " ");
		}
		System.out.println();
		
		// 4. Array->ArrayList : 5의 배수만 넣기
		List<Integer> list = new ArrayList<Integer>();
		for(int n : arr1) {
			if(n % 5 == 0) {
				list.add(n);
			}
		}
		System.out.println(list);
	}
}

 

 

Stream 사용 경우..(매우매우 간단해진다)

- Stream은 내부연산자로, 아래 코드처럼 호출한것처럼 안에서만 전부 처리된다. next()와는 반대되는결임.

IntStream intStream = Arrays.stream(arr);
// 인트스트림을 가지고 박싱한다.
List<Integer> listFromStream = 
intStream.boxed() // int -> Stream<Integer>
.distinct()       // 중복제거
.sorted()        // 정렬 : Comparator.reverseOrder()(내림차순)
.filter(n -> n % 5 == 0) // 람다식 발동(필터 : 5의 배수만 넣기)
.collect(Collectors.toList()); // 생성 : List
System.out.println(listFromStream);

 

- Stream은 1회용이다.

// Stream은 1회용
IntStream intStream1 = Arrays.stream(arr);
// count() sum() min() max() average()
System.out.println(intStream1.count());
System.out.println(intStream1.sum()); // 재사용 불가
System.out.println(intStream1.max().orElse(0));; // 재사용 불가, orElse : null 값이면 0출력

 

 

- reduce는 데이터를 모아준다.

    IntStream intStream2 = Arrays.stream(arr); 

    String result =
            intStream2.boxed()
                      .distinct()
                      .sorted()
                      .filter(n->n%5==0)
                      .map(n->n+" ") // "5 " "10 " "15 " "20 " "25 "
                      .reduce("",(a,b) -> b+a); // a 초기값 : "" a = 누적변수이다.
    //                         "25 " + "20 " + "15 " + "10 " + "5 " + ""
    System.out.println(result);

    // reduce test
    IntStream intStream4 = IntStream.range(1, 11); // 1~10까지의 수
    int total_result =
            intStream4.reduce(0, (total,n)->total+n); // total = total + n
                              // 0 + 1 + 2 + 3 ..... + 10
    System.out.println(total_result); // result = 55

 

반응형

'java(2)↗' 카테고리의 다른 글

JSP를 활용해서 웹사이트 만들기  (0) 2024.06.05
java 알고리즘 보물창고  (0) 2024.05.29
java 2차원배열 및 알고리즘  (0) 2024.05.14
java 요약노트(2)  (0) 2024.05.13
VO와 DTO와 DAO  (0) 2024.05.12