Spring(2023-05-09)

권단비·2023년 5월 9일
0

IT

목록 보기
133/139

[스트림]

[StreamExample.java]
import java.util.ArrayList;
import java.util.stream.IntStream;
import java.util.stream.Stream;

// 스트림의 이해
// 1.입력과 출력 수업에서 살펴본 스트림과는 전혀 다른 개념
// 2.자바에서는 많은 양의 데이터를 저장하기 위해서 배열이나 컬렉션을 사용합니다.
// 이렇게 저장된 데이터에 접근하기 위해서는 반복문이나 반복자(iterator)를 사용하여 매번 새로운 코드를 작성
// 이렇게 작성된 코드는 길이가 너무 길고 가독성도 떨어지며, 코드의 재사용이 거의 불가
// 즉, 데이터베이스의 쿼리와 같이 정형화된 처리 패턴을 가지지 못했기에 데이터마다 다른 방법으로 접근
// 3. 문제점을 극복하기 위해서 Java SE 8부터 스트림(stream) API를 도입
// 4.스트림 API는 데이터를 추상화하여 다루므로, 다양한 방식으로 저장된 데이터를 읽고 쓰기 위한 공통된 방법을 제공
// 스트림 API를 이용하면 배열이나 컬렉션뿐만 아니라 파일에 저장된 데이터도 모두 같은 방법으로 다룰 수 있게 됨

/*
스트림 API의 동작 흐름
스트림 API는 다음과 같이 세 가지 단계에 걸쳐서 동작합니다.
1. 스트림의 생성
2. 스트림의 중개 연산 (스트림의 변환)
3. 스트림의 최종 연산 (스트림의 사용)
*/

//스트림의 중개 연산 함수
/*
  - filter() / distinct()
  - map() / flatMap()
  - sorted()
  - peek()
  - limit()
  - skip()
*/

// 최종연산함수 종류
/* 
  - forEach()
  - match()
  - sum(), count(), average(), max(), min()
  - reduce()
  - collect() 
*/
public class StreamExample {
	public static void main(String args[]) {
		// 1부터 10까지 찍기
		ArrayList<Integer> list = new ArrayList<Integer>();

		for (int i = 1; i <= 10; i++) {
			list.add(i);
		}

		for (int i : list) {
			System.out.print(i + " ");
		}
		System.out.println();
		// 스트림으로 해결
		Stream<Integer> stream = list.stream();
		stream.forEach(i -> System.out.print(i + " "));
		System.out.println();
//===============================================================================
		// 1부터 10까지 찍기
		for (int i = 1; i <= 10; i++) {
			System.out.print(i + " ");
		}
		System.out.println();
		// 스트림으로 해결
		IntStream.rangeClosed(1, 10).forEach(i -> System.out.print(i + " "));
		System.out.println();
		// [1,2,3...10]
//===============================================================================
		// 짝수 찍기 2 4 6 8 10
		for (int i : list) {
			if (i % 2 == 0)
				System.out.print(i + " ");
		}
		System.out.println();
		// 스트림으로 해결
		stream = list.stream();
//		stream.filter(i -> i % 2 == 0).forEach(i -> System.out.print(i));
		stream.filter(i -> i % 2 == 0).forEach(System.out::print);
		System.out.println();
//===============================================================================
		// 1부터 10까지의 합
		int sum = IntStream.rangeClosed(1, 10).sum();
		System.out.println(sum); // 55출력
		System.out.println(IntStream.rangeClosed(1, 10).sum()); // 55출력

		// 1부터 100까지의 짝수들의 합
		sum = IntStream.rangeClosed(1, 100).filter(i -> i % 2 == 0).sum();
		System.out.println(sum); // 2550출력

		// 1부터 100까지의 홀수들의 합
		sum = IntStream.rangeClosed(1, 100).filter(i -> i % 2 == 1).sum();
		System.out.println(sum); // 2500출력
//===============================================================================
		// 중간 연산에서 map
		// 1부터 10까지의 숫자 중 짝수를 골라서 해당 짝수에 *2를 해서 결과값을 나타내어라. || 2, 4, 6, 8, 10 *2의 값 (4, 8, 12, 16, 20)
		IntStream.rangeClosed(1, 10).filter(i -> i % 2 == 0).map(i -> i * 2).forEach(System.out::println);
//		IntStream.rangeClosed(1, 10).filter(i -> i % 2 == 0).map(i -> i * 2).forEach(i -> System.out.println(i));

		// 1부터 10까지의 숫자 중 짝수를 골라서 해당 짝수에 *2를 해서 전부 더한 값은? || 60
		sum = IntStream.rangeClosed(1, 10).filter(i -> i % 2 == 0).map(i -> i * 2).sum();
		System.out.println(sum);
	}
}
[결과값]
1 2 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 8 9 10 
2 4 6 8 10 
246810
55
55
2550
2500
4
8
12
16
20
60

[LambdaExample2.java]
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

class Grade {
	private String name;
	private int kor;
	private int eng;
	private int math;
public Grade() {
}
public Grade(String name, int kor, int eng, int math) {
	this.name = name;
	this.kor = kor;
	this.eng = eng;
	this.math = math;
}

public String getName() {
	return name;
}

public void setName(String name) {
	this.name = name;
}

public int getKor() {
	return kor;
}

public void setKor(int kor) {
	this.kor = kor;
}

public int getEng() {
	return eng;
}

public void setEng(int eng) {
	this.eng = eng;
}

public int getMath() {
	return math;
}

public void setMath(int math) {
	this.math = math;
}

public double getAvg() {
	return ((this.getEng() + this.getKor() + this.getMath()) / 3.0);
}

}

public class LambdaExample2 {
public static void main(String args[]) {
List gradeList = new ArrayList();
gradeList.add(new Grade("홍길동", 90, 75, 100));
gradeList.add(new Grade("홍길순", 90, 75, 300));
gradeList.add(new Grade("홍순자", 90, 75, 400));
gradeList.add(new Grade("허길동", 70, 75, 400));

	// 1. 각각의 멤버들의 평균을 뽑아 보자

// gradeList.stream().forEach(grade -> System.out.println(grade.getName())); // 각 멤버들의 이름 출력 || 홍길동, 홍길순, 홍순자
gradeList.stream().forEach(grade -> {
System.out.println(grade.getName() + ":" + grade.getAvg());
// double avg = (grade.getEng() + grade.getKor() + grade.getMath()) / 3.0;
// System.out.println(grade.getName() + ":" + avg);
});
System.out.println("--------------------------------");

	// 2. 허씨성 결과 값이 나오지 안도록
	gradeList.stream().filter(grade -> !grade.getName().contains("허")).forEach(grade -> {
		System.out.println(grade.getName() + ":" + grade.getAvg());
	});
	System.out.println("--------------------------------");

	// 3. 국어 점수가 90점 이상인 사람만 평균이 출력 되도록 하시오.
	// grade.getKor() >= 90 == return grade.getKor() >= 90;
	gradeList.stream().filter(grade -> grade.getKor() >= 90).forEach(grade -> {
		System.out.println(grade.getName() + ":" + grade.getAvg());
	});
}

}

>```
[결과값]
홍길동:88.33333333333333
홍길순:155.0
홍순자:188.33333333333334
허길동:181.66666666666666
--------------------------------
홍길동:88.33333333333333
홍길순:155.0
홍순자:188.33333333333334
--------------------------------
홍길동:88.33333333333333
홍길순:155.0
홍순자:188.33333333333334

0개의 댓글