Java
[Java8] Stream API 예제
먹태
2021. 7. 10. 17:07
OnlineClass.java
package java8study;
public class OnlineClass {
private Integer id;
private String title;
private boolean closed;
public OnlineClass(Integer id, String title, boolean closed) {
this.id = id;
this.title = title;
this.closed = closed;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public boolean isClosed() {
return closed;
}
public void setClosed(boolean closed) {
this.closed = closed;
}
}
- id, 수업제목, closed여부
Aapp2.java
package java8study;
import javax.sound.midi.Soundbank;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Spliterator;
import java.util.function.Predicate;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class App2 {
public static void main(String[] args) {
List<OnlineClass> springClasses = new ArrayList<>();
springClasses.add(new OnlineClass(1, "spring boot", true));
springClasses.add(new OnlineClass(2, "spring data jpa", true));
springClasses.add(new OnlineClass(3, "spring mvc", false));
springClasses.add(new OnlineClass(4, "spring core", false));
springClasses.add(new OnlineClass(5, "rest api development", false));
System.out.println("=== spring으로 시작하는 수업 ===");
springClasses.stream().filter(oc->oc.getTitle().startsWith("spring"))
.forEach(oc-> System.out.println(oc.getId() + ": " + oc.getTitle()));
System.out.println("=== closed 안된 수업 ===");
// springClasses.stream().filter(oc->!oc.isClosed())
// .forEach(oc-> System.out.println(oc.getId()))
/// 메소드 레퍼런스로 변경
springClasses.stream().filter(Predicate.not(OnlineClass::isClosed))
.forEach(oc-> System.out.println(oc.getId()));
System.out.println("=== 수업 이름만 모아서 stream 만들기 ===");
// springClasses.stream()
// .map(oc->oc.getTitle())
// .forEach(s-> System.out.println(s));
///메소드 레퍼런스로 변경
springClasses.stream()
.map(OnlineClass::getTitle)
.forEach(System.out::println);
}
}
- Filter(Predicate) : 말그대로 조건을 줘서 걸러냄
- Map, FlatMap (Function) : 위의 소스에서는 OnlineClass의 Title만 새로운 스트림으로 만들어줌
FlatMap은 스트림의 형태가 배열과 같을 때, 모든 원소를 단일 원소 스트림으로 반환해준다
참고 : https://madplay.github.io/post/difference-between-map-and-flatmap-methods-in-java
* 메소드 레퍼런스 : 구현하고자 하는 람다식 자체가 구현되어있는 경우가 있다.
이럴때 사용하는 메서드 참조용 특수 문법이 있는데, 이 방식을 메소드 참조라고 표현한다
https://imcts.github.io/java-method-reference/
package java8study;
import javax.sound.midi.Soundbank;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Spliterator;
import java.util.function.Predicate;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class App2 {
public static void main(String[] args) {
List<OnlineClass> springClasses = new ArrayList<>();
springClasses.add(new OnlineClass(1, "spring boot", true));
springClasses.add(new OnlineClass(2, "spring data jpa", true));
springClasses.add(new OnlineClass(3, "spring mvc", false));
springClasses.add(new OnlineClass(4, "spring core", false));
springClasses.add(new OnlineClass(5, "rest api development", false));
List<OnlineClass> javaClasses = new ArrayList<>();
javaClasses.add(new OnlineClass(6, "The java, test", true));
javaClasses.add(new OnlineClass(7, "The java, Code manipulation", true));
javaClasses.add(new OnlineClass(8, "The java, 8 to 11", false));
List<List<OnlineClass>> jooEvent = new ArrayList<>();
jooEvent.add(springClasses);
jooEvent.add(javaClasses);
System.out.println(" === 두 수업 목록에 들어있는 모든 수업 아이디 출력 ===");
jooEvent.stream().flatMap(list -> list.stream())
.forEach(oc -> System.out.println(oc.getId()));
System.out.println(" === 10부터 1씩 증가하는 무제한 스트림 중에서 앞에 10개 빼고 최대 10까지만 ===");
Stream.iterate(10,i->i+1)
.skip(10)
.limit(10)
.forEach(System.out::println);
System.out.println(" === 자바 수업 중에 test가 들어있는 수업이 있는지 확인 ===");
boolean testChk = javaClasses.stream().anyMatch(oc -> oc.getTitle().contains("test"));
System.out.println("-> " + testChk);
System.out.println(" === 스프링 수업 중에 제목에 spring이 들어간 제목만 모아서 List로 만들기 ===");
List<String> spring = springClasses.stream()
.filter(oc -> oc.getTitle().contains("spring"))
.map(oc -> oc.getTitle())
.collect(Collectors.toList());
spring.forEach(System.out::println);
}
}
- limit(long), skip (long) : 제한하기
- anyMatch(), allMatch(), nonMatch() : 스트림에 있는 데이터가 특정 조건을 만족하는지 확인
위 소스에서는 제목에 "test"가 들어있는지 확인하고 boolean으로 리턴
allMatch() : 모든 요소들이 매개값(Predicate)으로 주어진 조건을 만족하는지
anyMatch() : 최소한 한 개의 요소가 조건에 만족하는지
noneMatch() : 모든 요소들이 주어진 조건을 만족하지 않는지
강의 : 인프런 더 자바, Java8