예시)

ㄴ 배열이든 콜렉션이든 의도했던 기능은 다 똑같지만 형태(메서드, 클래스, 등등)가 다르다
-> 불편쓰
-> 그래서 스트림 등장

ㄴ 스트림객체가 된 이후 처리식이 배열이든 콜렉션이든 똑같음
java.util.stream
배열이든, 컬렉션이든 데이터 소스가 무엇이든 간에 Stream 객체로 변환하면 동일한 방식으로 처리 가능 -> 처리방식의 통일성
데이터 소스가 무엇이든 간에 같은 방식으로 다룰 수 있게 데이터를 추상화 하고 데이터를 다루는데 자주 사용되는 메서드들을 정의해 놓음
데이터 군을 다룰때 많이 사용하는 기능을 모아 놓은 인터페이스(편의 기능)
예시)

예시)

↓ 스트림은 일회용이기 때문에 새로 만들어야 가능

예시)

어디로 보내야 하낭,,,5/2 오후2시 강의...눈물난다...


ㄴ 함수형인터페이스가 매개변수로 쓰임...?
ㄴ map은 가리키는 역할...?
ㄴ 추상메서드 정의해줘야함
Collection
Stream stream()
Collection 인터페이스 - Stream<E> stream()
Stream<E> IntStream mapToInt(IntUnaryOperator..) : Stream<Integer> -> IntStreamLongStream mapToLong(LongUnaryOperator..) : Stream<Long> -> LongStreamDoubleStream mapToDouble(DoubleUnaryOperator ..) : Stream<Double> -> DoubleStream
Arrays
static stream(....)
Arrays.stream(...)
Stream<T>예시)

↓ 스트림객체가 됨

ㄴ 스트림 객체가 된 이후 배열이든 콜렉션이든 처리식이 똑같음
Stream
.of(T... )
참고)
JDK8 부터 정적 메서드 of(...)가 주로 객체를 생성하는 역할을 한다.
-> of(...) : 객체 생성 메서드
Stream
IntStream
LongStream
DoubleStream
예시)

mapToInt : IntStream
mapToLong : LongStream
mapToDouble : DoubleStream
참고)
map : 변경
예시1)

ㄴ 콜렉션(객체)으로는 연산이 안되니까 mapToInt를 통해 IntStream형태로 바꿔서 연산
예시2) 기본 자료형 스트림에서 일반 스트림(Stream<T>)에 있는 기능이 필요한 경우 있다.



sorted()는 IntStream(기본자료형스트림)에 정의된 기본정렬기능이다
ㄴ 기본정렬 : 오름차순
ㄴ 정렬을 바꾸고 싶네 ex) 내림차순...
ㄴ 근데 IntStream에는 정렬 기능 sorted() 메서드 1개만 정의되어있음
-> 대안기준x = 내림차순으로 변경불가
어 근데 일반 스트림 Stream<Integer>에는 sorted()와 sorted(Comparator...)가 정의되어 있다.
ㄴ sorted(Comparator...) : 대안적인 기준 -> 내림차순정렬 가능
ㄴ 그러면 일반 스트림 Stream<Integer>을 통해서는 가능하지 않을까?
ㄴ 기본자료형스트림인 IntStream을 일반 스트림인 Stream<Integer>로 변환하고sorted(Comparator...) 통해서 정렬을 바꾸자ㅏㅏ
어떻게 바꾸지?
-> boxed() 통해서 바꿀 수 있음
ㄴ IntStream .. boxed() -> Stream<Integer>
참고) 자바문서 IntStream
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/stream/IntStream.html
참고) 자바문서 Stream
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/stream/Stream.html
boxed()
예)
IntStream -> Stream<Integer>
LongStream -> Stream<Long>
예시) 기본 자료형 스트림에서 일반 스트림(Stream<T>)에 있는 기능이 필요한 경우 있다.

ㄴ Comparator기능을 스기위해 일부러 기본자료형스트림에서 일반스트림으로 boxed()를 통해 변환함

ㄴ 일반스트림의 대안기준정렬 사용
ㄴ mapToInt를 통해 일반 스트림 -> 기본 자료형 스트림으로 다시 재 변환

ㄴ 내림차순으로 정렬됨
Stream<E>ntStream, LongStream, DoubleStream
예시)

ㄴ predicate

ㄴ forEach가 최종연산기능
ㄴ forEach는 반환값이 void

ㄴ 최종연산이 나오기 전엔 연산이 실행되지 않음
ㄴ 스트림객체를 반환하면 스트림객체가 나온다
ㄴ 연결해서 연산을 이어나가기 위해서(중간연산)
-> 보통 스트림은 연속된 작업을 많이함 = 작업에 대한 목록 나열 : 메서드체이닝
-> 반환값이 스트림이 아니면 연결할 수가 없음 = 마지막 (최종연산)
예시2)

ㄴ count = 최종연산
예시3)

예시4)

Collection::stream() : 일반 스트림
Arrays.stream(...) : 일반스트림 + 기본 자료형 스트림
Stream.of(T.... ) : 일반스트림, 기본 자료형 스트림
기본 자료형 스트림 (InstStream, LongStream)
range(int s, int e) : s 이상 e 미만rangeClosed(int s, int e) : s 이상 e 이하예시)

↓ 원래는 for문써서 반복했는데 range쓰니까 코드줄었네ㅔㅔ


ㄴ 반복되는 값 잘 나온다ㅏㅏ
예시2)

예시3) predicate
반환값이 참이면 통과, 거짓이면 안내보냄

참고)
IntStream
static IntStream range(시작번호, 종료 번호(미만))
rangeClosed(시작번호, 종료 번호(이하))
IntSummaryStatistics summaryStatistics()
예시) iterate()

ㄴ 매개변수ㅇ -> 연산식ㅇ
ㄴ iterate() = 무한대로 값이 출력되기 때문에 컴터 다운됨
ㄴ limit로 제한해주기
예시) generate()

ㄴ 매개변수x -> 값만 나온다
ㄴ generate() = 무한대로 값이 출력되기 때문에 컴터 다운됨
ㄴ limit로 제한해주기
예시)

ㄴ 2개의 스트림 만듬
ㄴ concat()통해 2개 스트림 합침
ㄴ 배열로 출력
예시) limit()

예시) skip()

↓ 코드 줄이기 위해 메서드 참조 사용

filter(Predicate<T> ...) : 스트림을 걸러주는 기능
distinct() : 중복 제거
예시) filter(Predicate<T> ...)

참고) 기본 자료형 스트림 변환 메서드
IntStream mapToInt(ToIntFunction<T>...)LongStream mapToLong(ToLongFunction<T>...)DoubleStream mapToDouble(ToDoubleFunction<T>...)
Stream peek(Consumer<T> ... ) : 중간 연산 : 중간에 값을 확인할 경우 많이 사용 void forEach(Consumer<T> ...) : 최종 연산 : 최종적으로 출력할때 사용예시)

boolean allMatch(Predicate ... ) : 전부 참인 경우 참
boolean anyMatch(Predicate ...) : 어떤 것이든 하나라도 참이면 참
boolean noneMatch(Predicate ...) : 전부 거짓일때 참
T findFirst() : 가장 첫번째 스트림의 요소를 반환
Collector
java.util.stream.Collectors
JDK8
null에 대한 다양한 처리 방법을 제공하는 클래스
Wrapper 클래스
목적
특징
private final T value;class Optional<T> {
...
private final T value;
...
}
참고)
API 문서에서 반환값 타입 Optional 인 경우 : 결과가 null일 가능성이 있는 메서드..
예시)

ㄴ 왜 반환값 타입이 Optional일까?
ㄴ null이 발생할 수 있는 가능성이 있어 null에대한 처리를 하라고 반환값이 Optional
static Optional<T> of(T t)static Optional<T> ofNullable(T t)예시)

예시2)


ㄴ NPE

T get()T orElse(T other)T orElseGet(Supplier<T ... > ) 사용예시)

T orElseGet(Supplier<T ... > )T orElseThrow()T orElseThrow(Supplier<T ... > )예시)

예시)


ㄴ 중첩된 스트림

ㄴ flatMap 사용

ㄴ 배열로
참고) 자바스크립트 배열 객체 every와 비슷
예시)

참고) 자바스크립트 배열 객체 some과 비슷
예시)

예시1)

예시2)

참고) findAny() : 병렬 스트림인 경우 가장 먼저 나오는 요소
예시)

ㄴ 100개의 무작위수를 만듬
ㄴ 100개를 무작위로 뽑아왔는데 홀수가 없는 경우도 있을 수 있음
ㄴ 그래서 findFirst()의 반환값이 옵셔널인트(null이 나올 가능성이 있다)
ㄴ orElse(-1) : 그런경우 -1이 반환되도록 설정
Stream<T>), 기본 자료형 스트림(IntStream, LongStream, DoubleStream) 예시)



예시)



예시1)

ㄴ 배열을 list형태로 바꿈
예시2)

ㄴ 많이쓰기 때문에 이미Stream에 정의되어 있음
예시)

ㄴ 배열을 set형태로 바꿈
예시)

예시)

ㄴ 하나의 문자열로 만듬

ㄴ "#"으로 이어붙이고 맨앞 "**", 맨뒤 "^^"
예시)
package exam01;
//// 멤버변수 정의, 생성자 정의, get() 정의, toString() 정의
public class Student {
private int ban;
private String name;
public Student(int ban, String name) {
this.ban = ban;
this.name = name;
}
public int getBan() {
return ban;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Student{" +
"ban=" + ban +
", name='" + name + '\'' +
'}';
}
}
package exam01;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static java.util.stream.Collectors.toMap;
public class Ex08 {
public static void main(String[] args) {
Student [] students = {
new Student(1, "이이름"),
new Student(1, "김이름"),
new Student(1, "박이름"),
new Student(2, "이이름"),
new Student(2, "김이름"),
new Student(2, "박이름"),
new Student(3, "이이름"),
new Student(3, "김이름"),
new Student(3, "박이름"),
};
/*
Map<Integer, Student> data = Arrays.stream(students)
.collect(toMap(Student::getBan, Student::getName));
System.out.println(data);
*/
Map<Integer, List<Student>> data = Arrays.stream(students)
.collect(Collectors.groupingBy(Student::getBan));
//.collect(Collectors.groupingBy(s -> s.getBan()));
List<Student> students2 = data.get(2);
students2.forEach(System.out::println);
}
}

예시)
package exam01;
// 멤버변수 정의, 생성자 정의, get() 정의, toString() 정의
public class Student {
private int ban;
private String name;
private int score;
public Student(int ban, String name) {
this.ban = ban;
this.name = name;
}
public Student(int ban, String name, int score) {
this.ban = ban;
this.name = name;
this.score = score;
}
public int getScore() {
return score;
}
public int getBan() {
return ban;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Student{" +
"ban=" + ban +
", name='" + name + '\'' +
'}';
}
}
