
스트림의 특징


스트림 생성하기



스트림 중간연산






스트림 최종연산




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 |