이 포스팅의 코드 및 정보들은 강의를 들으며 정리한 내용을 토대로 작성한 것입니다.
실습에 앞서, 과목번호(id), 과목명(subject), 개강여부(closed) 필드가 있는 SchoolClass 라는 클래스를 만들고, 이를 main()에서 ArrayList로 생성된 List 객체를 만들어 프로그래밍클래스(programmingClass), 이론클래스(theoryClass)의 데이터들을 추가한다.
밑에는 brucehan이 들을 bruceEvent라는 List형 객체를 만들어 프로그래밍/이론 클래스 각각을 추가했다.
List<SchoolClass> programmingClass = new ArrayList<>();
programmingClass.add(new SchoolClass(1, "JSP programming", true));
programmingClass.add(new SchoolClass(2, "C programming", true));
programmingClass.add(new SchoolClass(3, "Java programming", false));
programmingClass.add(new SchoolClass(4, "Android programming", false));
programmingClass.add(new SchoolClass(5, "React programming", false));
List<SchoolClass> theoryClass = new ArrayList<>();
theoryClass.add(new SchoolClass(6, "Operation System", true));
theoryClass.add(new SchoolClass(7, "Database", true));
theoryClass.add(new SchoolClass(8, "software engineering", false));
List<List<SchoolClass>> bruceEvents = new ArrayList<>();
bruceEvents.add(programmingClass);
bruceEvents.add(theoryClass);
programmingClass.stream()
.filter(sc -> sc.getSubject().contains("J"))
.forEach(sc -> System.out.println(sc.getSubject()));
// 과목 번호를 원한다면 sc.getId()로 변경
programmingClass.stream()
.filter(sc -> sc.!isClosed()) // 안 닫혔니?
.forEach(sc -> System.out.println(sc.getSubject()));
/*
* .filter(sc -> sc.!isClosed()) 대신에
* .filter(Predicate.not(SchoolClass::isClosed))도 가능
*/
programmingClass.stream()
.map(sc -> sc.getSubject()) // String 타입으로 매핑(변경)
.forEach(sc -> System.out.println(sc));
programmingClass.stream()
.map(SchoolClass::getSubject) // String 타입으로 매핑(변경)
.forEach(System.out::println);
변경할 때는 flatMap이라는 중계 오퍼레이션을 쓸 것이다.
flatmap은 List< SchoolClass > 타입을 받는다.
bruceEvents.stream()
.flatMap(Collection::stream) // flatten
// .flatMap(list -> list.stream())도 가능
.forEach(sc -> System.out.println(sc.getId())); // 여기서부터는 SchoolClass 타입이 옴
이는 Stream의 iterate()를 활용해서 구현할 수 있다.
// iterate()는 중계 operation이기 때문에 실행하면 아무 일도 일어나지 않음
Stream.iterate(10, i -> i+1) // 여기까지는 무제한 스트림
skip과 limit으로 출력할 개수를 제한한 후 20~29까지의 값을 출력한다.
anyMatch()를 통해서 어떤 거라도 특정 조건을 만족하는 데이터를 담고 있는지 확인하고자 한다.
map()으로 먼저 과목의 제목을 모을 수도 있고, filter()를 통해서 먼저 거를 수도 있다.
List<String> collect = programmingClass.stream()
.filter(sc -> sc.getSubject().startsWith("J"))
.map(SchoolClass::getSubject) // .map(sc -> sc.getSubject())
.collect(Collectors.toList());
collect.forEach(System.out::println);
List<String> collect = programmingClass.stream()
.map(SchoolClass::getSubject) // .map(sc -> sc.getSubject())
.filter(s -> s.startsWith("J")) // map에서 먼저 String들을 모아왔기에 바로 조건을 걸 수 있음
.collect(Collectors.toList());
collect.forEach(System.out::println);
Stream API
걸러내기
변경하기
생성하기
제한하기
스트림에 있는 데이터가 특정 조건을 만족하는지 확인
개수 세기
스트림을 데이터 하나로 뭉치기