

Stream<T> Collection.stream()Stream<Integer> intStram = list.stream();
Stream<String> strstream = Stream.of(mew String[] {"1", "b", "c"}); //배열
Stream<Integer> evenStream = Stream.iterate(0,n->n+2); //0,2,4,6,...
Stream<double> randomStream = Stream.generate(Math::random); //람다식
InteStream int Stream = new Random().ints(5); //난수 스트림(크기가 5)

1. 작업 할 배열을 만든다
String[] strArr = {"dd","aaa","CC","cc","b"};
2. 스트림을 만든다
Stream<String> stream = Stream.of(strArr);
3. 중간연산 n번
Stream<String> filteredStream = stream.fileter();
Stream<String> distincedStream = stream.distinct();
Stream<String> sortedStream = stream.sort();
Stream<String> limitedStream = stream.limit(5);
4. 최종 연산(요소 개수 세기)
int total = stream.count();
List<Integer> list = Arrays.asList(3,1,5,4,2);
List<Integer> sortedList = list.stream().sorted(); //리스트를 정렬해서
. .collect(Collectors.toList()); //새로운 List에 저장
System.out.println(list); //[3,1,5,4,2]
System.out.println(sortedList); //[1,2,3,4,5]
(자세한 건 신경쓰지마세요)
strStream.forEach(System.out.::println); //모든 요소를 화면에 출력
int numOfstr = strrStream.count(); //에러. 스트림 이미 닫힘.
IntStream intStream = new Random().ints(1,46); //무한스트림
intStream.distinct().list(6).sorted() //중간연산
.forEach(i -> System.out.println(i+",")); //최종연산
무한인데 중복제거가 됩니다. 중간 연산으로 중복 제거, 정렬, ...했지만. 스트림이 중복제거->자르고->정렬 이렇게 하는게 아니에요. 바로 하지 않고, 이 스트림을 가지고 어떤 작업을 해야하는지 표시만 해놨다가 나중에 필요할 때 수행해요.
for(String str : strList)
System.out.prinlt(str);
↓
stream.forEach(System.out::println);
Stream<String> strStream = Stream.of("dd","aaa","CC","cc","b");
int sum = str.stream.parallel() //병렬 스트림으로 전환
.mapToInt(s->s.length()).sum();

Stream<E> stream() //Collection 인퍼에시으스이 메서드List<Integer list = Arrats.asList(1,2,3,4,5);
Stream<Integer> intStream = list.stream(); //list를 스트림으로 변환
//스트림의 모든 요소를 출력
intStream.forEach(System.out::print); //메서드 참조형
intStream.forEach((i)->System.out.println(i));
Stream<T> Stream.of(T...vlues) //가변인자
Stream<T> Stream.of(T[])
Stream<T> Arrays.strea(T[])
Stream<T> Arrays.stream(T[] array, int startInclusice, int endExclusive)
Stream<String> strStream = Stream.of("a","b","c); //가변인자
Stream<String> strStream = Stream.of(new String[]{"a","b","c"});
Stream<String> strStream = Arrays.stream(new String[]{"a","b","c"});
Stream<String> strStream = Arrays.stream(new String[] {"a","b","c"},0,3);
IntStream.IntStream.of(int...values) //Stream 아니라 IntStream
IntStream.IntStream.of(int[])
IntStream.Arrays.stream(int[])
IntStream.Arrays.stream(int[] array, int startIncluesive, int endExclusive)
실습
//방법1
Stream<String> strStream = Stream.of("a","b","c");
//방법2
String[] strArr2 = new String[] {"a","b","c","d"};
Stream<String> strStream2 = Stream.of(strArr2);
//방법3
String[] strArr3 = {"a","b","c","d"};
Stream<String> strStream3 = Arrays.stream(strArr3);
//방법1
int[] intArr = {1,2,3,4,5};
IntStream intStream = Arrays.stream(intArr);
//count()말고도 다른 메서드들이 많이 있음
System.out.println(intStream.sum());
System.out.println(intStream.average());
//방법2
Integer[] intArr2 = {1,2,3,4,5};
//int[] intArr2 = {1,2,3,4,5}; 안됨. int배열이라 <Integer>스트림으로 못 받음
Stream<Integer> intStream2 = Arrays.stream(intArr2);
//count()만 있음
System.out.println(intStream2.count());

IntStream intStream1 = new Random().ints();
intStream.limit(5).forEach(System.out::println); //limit로 잘라서 5개 요소만 출력한다
IntStream intStream3 = new Random().ints(5); //크기가 5인 난수 스트림을 반환


간단한 거니까 실습을 생략할게요


Stream<Path> Files.list(Path dir) : Path는 파일 또는 디렉토리Stream<String> Files.line(Path path)
Stream<String> Files.ines(Path path, Charset cs)
Stream<String> lines() //BuggeredReader 클래스의 메서드
Stream emptySream = Stream.empty();
long count = emptyStream.count(); //카운트의 값은 0





public class Ex14_5 {
public static void main(String[] args) {
Stream<Student> studentStream = Stream.of(
new Student("이자바",3,300),
new Student("김자바",3,300),
new Student("안자바",3,300),
new Student("박자바",3,300),
new Student("소자바",3,300),
new Student("나자바",3,300),
new Student("감자바",3,300)
);
studentStream.sorted(Comparator.comparing(Student::getBan)
.thenComparing(Comparator.naturalOrder()))
.forEach(System.out::println);
}
}
class Student implements Comparable<Student> {
String name;
int ban;
int totalScore;
Student(String name, int ban, int totalScore) {
this.name = name;
this.ban = ban;
this.totalScore = totalScore;
}
public String toString() {
return String.format("[%s, %d, %d]", name, ban, totalScore);
}
String getName() {return name;}
int getBan() {return ban;}
int getTotalScore() {return totalScore;}
public int compareTo(Student s) {
return s.totalScore - this.totalScore;
}
}


public class Ex14_5 {
public static void main(String[] args) {
File[] fileArr = {new File("Ex1.java"), new File("ex1,bak"),
new File("Ex2.java"), new File("Ex1"), new File("Ex1.txt")};
Stream<File> fileStream = Stream.of(fileArr);
Stream<String> filenameStream = fileStream.map(File::getName);
filenameStream.forEach(System.out::println);
fileStream = Stream.of(fileArr); //스트림을 다시 생성
fileStream.map(File::getName)
.filter(s->s.indexOf('.')!=-1) //확장자가 없는 것은 제외
.forEach(System.out::println);
}
}



항상 null이 아님.public final class Iotional<T> {
private final T value; //T타입의 참조변수
...
}
Optional 객체를 생성하는 다양한 방법
Streing str - "Abc";
Optional<String> optVal = Optional.of(str);
Optional<String> optVal = OPtional.of("abc");
Optional<String> optVal = OPtional.if(null); //널포인터익셉션 발생
Optional<String> optVal = OPtional.ofNullable(null) //OK
널을 넣는건 안되므로, 널을 저장할 수 있는 Opational은 네번째꺼. 그럼 널을 넣고 싶으면 보통 네 번째꺼를 쓰겠죠.

↑ 한단계 더 거치는 것
Object[] objArr = null; 로 하지 말고
objArr = new Object[0]; //크기 0인걸로 초기화하자고.
이렇게 하는 것들이 null포인터 익셉션을 피하기 위한거에요.




public final class OptionalInt{
private final boolean isPresent;
private final int value;
}

OptionalInt opt = OptionalInt.of(0); //OptionalInt에 0 저장
OptionalInt opt2 = OptionalInt.empty(); //OptionalInt에 0 저장
이것을 어떻게 구별? 구별 가능?
그러니까 ispresent를 쓰는 것.
System.out.println(opt.ispresent()); //true
System.out.println(opt2.ispresent()); //false
System.out.println(opt.equals(opt2)); //false

findAny() : 병렬 - filter랑 같이 쓰임
indFirst() : 직렬 - filter랑 같이 쓰임...?
reduce(), collect()가 최종연산의 핵심







더하면 정신병 걸릴거같아서 stop 나머지는 책에