본문 바로가기
Java 공부 기록

스트림(Stream)

by moonchance 2023. 6. 27.

 

스트림의 특징

 

스트림 생성하기

 

스트림 중간연산

 

스트림 최종연산

 

 

collect(), collector(), collectors()

 

 

Collectors의 메서드

 

스트림의 변환

 

[출처]자바의 정석

 

 

실습을 해보자.

package chap_21;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.OptionalDouble;
import java.util.stream.Stream;

public class _06_Stream {

	public static void main(String[] args) {
		/* 스트림(Stream) : 자료의 대상과 관계없이 동일한 연산을 수행할 수 있도록 해주는 반복자
		 * 실제 입력/출력이 표현된 데이터의 이상화된 흐름
		 * - 스트림은 자료에 대한 스트림을 생성하여 연산을 다 수행하면 스트림은 소모됨.
		 * - 다른 연산을 수행하려면 스트림을 다시 생성해야 함.
		 * - 스트림 연산은 기존 자료에 변경을 유발하지 않음.
		 * - 스트림 복사본을 이용하여 자료를 연산함.
		 * - 중간연산과 최종연산으로 구분이됨.
		 * - 중간연산 : filter =>조건에 맞는 요소를 추출, map => 원하는 필드만 뽑거나 변환
		 * - 최종연산 : forEach(), sum()
		 * 
		 * Arrays.stream(배열명) : 배열 값을 이용한 스트림 생성
		 * list.Stream() : 리스트에서 스트림 생성
		 */
		int[] arr = {1,2,3,4,5,6,7,8};
		int sum = 0;
		for (int i = 0; i < arr.length; i++) {
			sum += arr[i]; 
		}
		System.out.println(sum);
		System.out.println("--스트림을 이용한 합계--");
		int total = Arrays.stream(arr).sum(); // 합계
		System.out.println(total);
		long count = Arrays.stream(arr).count(); // 카운트
		System.out.println(count);
		OptionalDouble avg = Arrays.stream(arr).average(); // 평균
		System.out.println(avg);
		
		// 점수 배열을 생성한 후 70점 이상(filter)만 합계(sum())
		int[] arr2 = {57, 84, 55, 70, 85, 99};
		sum = 0;
		for (int i = 0; i < arr2.length; i++) {
			if (arr2[i] >= 70) {
				sum += arr2[i];
			}
		}
		System.out.println(sum);
		
		int sum2 = Arrays.stream(arr2).filter(n -> n >= 70).sum();
		System.out.println(sum2);
		
		ArrayList<Integer> list = new  ArrayList<>();
		list.add(5);
		list.add(12);
		list.add(45);
		list.add(6);
		list.add(6);
		list.add(9);
		list.add(12);
		list.add(9);
		list.stream().forEach(n -> System.out.println(n+ " "));
		System.out.println();
		System.out.println("----------------");

		list.stream().forEach(System.out :: println);
		System.out.println();
		System.out.println("----------------");
		// 가변 매개변수 => 스트림 객체 생성
		Stream<Integer> s1 = Stream.of(10,20,30,40,50,70,80);
		int s = s1.mapToInt(n -> n.intValue()).sum();
		System.out.println(s);
		// 한번 소모된 스트림은 다시 사용할 수 없음.
//		s1.forEach(System.out::println);
		
		// list에서 중복 제거 distinct() : 중복제거, 중간연산
		list.stream().distinct().forEach(System.out::println);
		System.out.println("----------------");
		// 정렬 sorted() : 정렬, 중간연산
		list.stream().sorted().forEach(System.out::println);
		System.out.println("----------------");
		// 중복 제거하여 정렬
		list.stream().distinct().sorted().forEach(System.out::println);
		
	}

}

 

package chap_21;

import java.util.ArrayList;
import java.util.Arrays;

public class _07_Stream2 {

	public static void main(String[] args) {
		/* 배열에서 짝수만 출력(정렬) 중복되는 값 제거
		 */
		int[] arr = {5,7,4,1,2,3,6,5,4,8,9,5,1,4,};
		// 배열 => stream : Arrays.stream(배열명)
		Arrays.stream(arr).filter(n -> n % 2 == 0).distinct().sorted().forEach(n -> System.out.print(n + " "));
		System.out.println();
		
		// 배열로 리턴(홀수만)
		int[] arr2 = Arrays.stream(arr).filter(n -> n % 2 != 0).distinct().sorted().toArray(); // 홀수만 출력
		
		for (int i : arr2) {
			System.out.print(i + " ");
		}
	}

}

 

package chap_21;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;

public class Student {
	// 학생 정보
	private String name;
	private int score;
	
	
	public Student(String name, int score) {
		this.name = name;
		this.score = score;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getScore() {
		return score;
	}
	public void setScore(int score) {
		this.score = score;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", score=" + score + "]";
	}
	
}
package chap_21;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class _08_Stream3 {

	public static void main(String[] args) {
		/* Student 클래스를 리스트로 구성하여 값을 add
		 * 3명만 추가
		 */
		
		ArrayList<Student> st = new ArrayList<>();
		st.add(new Student("길동", 80));
		st.add(new Student("오정", 99));
		st.add(new Student("오공", 78));
		
		// List를 스트림으로 구성하여 콘솔에 출력 예) 홍길동 : 98
		// List를 스트림으로 구성 스트림 객체 s 생성
		Stream<Student> s = st.stream();
		s.forEach(n -> System.out.println(n)); // toString 출력
		st.stream().forEach(n -> System.out.println(n.getName() + " : " + n.getScore()));
		
		
		List<Student> st2 = Arrays.asList(
				new Student("김구", 100),
				new Student("익점", 80),
				new Student("순신", 99)
				);
		
		// 점수합계를 출력
		int sum = st2.stream().mapToInt(n -> n.getScore()).sum();
		System.out.println(sum);
		// 인원수 출력
		long count = st2.stream().count();
		System.out.println(count + "명");
	}

}

'Java 공부 기록' 카테고리의 다른 글

wrapper 클래스, Number 클래스  (0) 2024.01.16
Math 클래스  (0) 2024.01.16
람다식(Lambda)  (0) 2023.06.27
지네릭(Generics), 열거형(enum)  (0) 2023.06.27
컬렉션 프레임(collections framework)  (0) 2023.06.20