[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