SlideShare a Scribd company logo
1 of 26
스트림API 스터디
2일 - 박병선
스트림API의 소개
List<Dish> lowCaloricDishes = new ArrayList<>();
for (Dish d : menu) {
if (d.getCalories() < 400) {
lowCaloricDishes.add(d);
}
}
Collections.sort(lowCaloricDishes, new Comparator<Dish>() {
@Override
public int compare(Dish d1, Dish d2) {
return Integer.compare(d1.getCalories(), d2.getCalories());
}
});
List<String> lowCaloricDishesName = new ArrayList<>();
for (Dish d : lowCaloricDishes) {
lowCaloricDishesName.add(d.getName());
}
컬렉션을 다뤄야 할 일이 많지만..
스트림API의 소개
SELECT name FROM dishes WHERE calorie < 400 ORDER BY calorie;
List<String> lowCaloricDishesName = menu.stream()
.filter(d -> d.getCalories() > 400)
.sorted(comparing(Dish::getCalories))
.map(Dish::getName)
.collect(toList());
함수형 스타일 코드는
변수의 명시적인 변경이나 재할당 문제를 피할 수 있다
서술적인 코드 작성이 가능하다
간결하다
직관적이다
명령형 -> 서술형
스트림API의 특징은
List<String> lowCaloricDishesName = menu.parallelStream()
.filter(d -> d.getCalories() > 400)
.sorted(comparing(Dish::getCalories))
.map(Dish::getName)
.collect(toList());
선언형
조립할 수 있음
병렬화
스트림과 컬렉션
컬렉션 : 모든 값을 메모리에 저장하는 자료구조
스트림 : 요청할 때만 요소를 계산
예) 스트리밍 영화, 소수 계산
1) 딱 한 번만 탐색할 수 있다
List<String> title = Arrays.asList(...);
Stream<String> s = title.stream();
s.forEach(System.out::println);
s.forEach(System.out::println); //java.lang.IllegalStateException
LSA에서는 예외는 발생하지 않는다. 그러
나 다시 반복되지 않고 바로 연산이 끝나기
때문에 한 번만 탐색할 수 있는 것은 동일하
다
스트림과 컬렉션
2) 외부 반복과 내부 반복
내부에서 병렬 처리가 가능해 지고
최적화된 순서로 처리할 수 있다
스트림 연산
중간 연산
- 다른 스트림을 반환
- 게으르다
최종 연산
중간 연산
List<String> dishes = Arrays.asList("pork", "beef", "chicken", "fish", "shoes");
List<String> names = dishes.stream()
.filter(d -> {
System.out.println("filtering " + d);
return d.length() > 2;
})
.map(d -> {
System.out.println("mapping " + d);
return d;
})
.limit(3).collect(Collectors.toList());
System.out.println(names);
filtering pork
mapping pork
filtering beef
mapping beef
filtering chicken
mapping chicken
[pork, beef, chicken]
실습
스트림 생성과 forEach
Collection.stream()
Iterable.forEach()
Stream.forEach()
아래 리스트를 forEach()로 출력해 보세요 (System.out.println)
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
LSA에서는 Stream.of()를 사용
스트림 생성과 forEach
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
System.out.println("JAVA8");
list.forEach(System.out::println);
list.stream().forEach(System.out::println);
System.out.println("LSA");
Stream.of(list).forEach(System.out::println);
filter(), distinct(), limit(), skip()
Stream<T> Stream<T>.filter(Predicate<? super T> var1)
- boolean 반환하는 람다
아래 리스트에서 처음 3개는 무시, 그 다음 20개만, 짝수인 것만, 중복 제거해서
System.out.println으로 출력해 보세요
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 7, 6, 5, 4, 3, 2, 1);
filter(), distinct(), limit(), skip()
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 7, 6, 5, 4, 3, 2, 1);
System.out.println("JAVA8");
list.stream().skip(3).limit(20).filter(v -> v % 2 == 0).distinct()
.forEach(System.out::println);
System.out.println("LSA");
Stream.of(list).skip(3).limit(20).filter(v -> v % 2 == 0).distinct()
.forEach(System.out::println);
map()
Stream<R> Stream<T>.map(Function<? super T, ? extends R> var1)
- T를 R로 만들어 주는 람다
아래 리스트에서 짝수만 골라서 각각 제곱한 결과를 System.out.println으로 출력해
보세요 (System.out.println)
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
map()
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
System.out.println("JAVA8");
list.stream().filter(v -> v % 2 == 0).map(v -> v * v).forEach(System.out::println);
System.out.println("LSA");
Stream.of(list).filter(v -> v % 2 == 0).map(v -> v * v).forEach(System.out::println);
flatMap()
flatMap()
anyMatch(), allMatch(), noneMatch()
Predicate를 확인해서 boolean 리턴
아래 리스트를 이용해서 *Match()를 확인해 보세요
List<Integer> list = Arrays.asList(0, 1);
findAny()
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
Optional<Integer> optional = list.stream().filter(v -> v % 2 == 0).findAny();
optional.ifPresent(v -> System.out.println("JAVA8: " + v));
int ret = list.stream().filter(v -> v < 0).findAny().orElse(-1);
findFirst()
반환 순서가 상관없다면 병렬 스트림에서는 findAny()
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
Optional<Integer> optional = list.stream().filter(v -> v % 2 == 0).findAny();
optional.ifPresent(v -> System.out.println("JAVA8: " + v));
병렬 스트림으로 실행해 봅시다
findAny()
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
Optional<Integer> optional = list.stream().filter(v -> v % 2 == 0).findAny();
optional.ifPresent(v -> System.out.println("JAVA8: " + v));
위의 코드를 LSA로 작성해 보세요
병렬 스트림을 지원하지 않는다!!!
reduce()
함수형 프로그래밍에서는 폴드 (fold)
reduce()
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
reduce()로 최소값을 찾아 보세요
초기값이 없으면?
reduce()
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
int min = list.stream().reduce(100, Math::min);
System.out.println("JAVA8: " + min);
min = Stream.of(list).reduce(100, Math::min);
System.out.println("LSA: " + min);
다음 시간에 봐요

More Related Content

Similar to 스트림Api 스터디 2일

2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)JiandSon
 
자바8 스트림 API 소개
자바8 스트림 API 소개자바8 스트림 API 소개
자바8 스트림 API 소개beom kyun choi
 
나에 첫번째 자바8 람다식 지앤선
나에 첫번째 자바8 람다식   지앤선나에 첫번째 자바8 람다식   지앤선
나에 첫번째 자바8 람다식 지앤선daewon jeong
 
MapReduce 실행 샘플 (K-mer Counting, K-means Clustering)
MapReduce 실행 샘플 (K-mer Counting, K-means Clustering)MapReduce 실행 샘플 (K-mer Counting, K-means Clustering)
MapReduce 실행 샘플 (K-mer Counting, K-means Clustering)주영 송
 
자바8강의 0강. java8 overview
자바8강의 0강. java8 overview자바8강의 0강. java8 overview
자바8강의 0강. java8 overviewSejong Park
 
Java Annotation과 MyBatis로 나만의 ORM Framework을 만들어보자
Java Annotation과 MyBatis로 나만의 ORM Framework을 만들어보자Java Annotation과 MyBatis로 나만의 ORM Framework을 만들어보자
Java Annotation과 MyBatis로 나만의 ORM Framework을 만들어보자Donghyeok Kang
 
(재직자환급교육/사업주위탁/IT실무교육/구로IT학원/오라클교육/SQL기초강좌/IT강좌)#10.SQL초보에서 Schema Objects까지
(재직자환급교육/사업주위탁/IT실무교육/구로IT학원/오라클교육/SQL기초강좌/IT강좌)#10.SQL초보에서 Schema Objects까지(재직자환급교육/사업주위탁/IT실무교육/구로IT학원/오라클교육/SQL기초강좌/IT강좌)#10.SQL초보에서 Schema Objects까지
(재직자환급교육/사업주위탁/IT실무교육/구로IT학원/오라클교육/SQL기초강좌/IT강좌)#10.SQL초보에서 Schema Objects까지탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Web vulnerability seminar2
Web vulnerability seminar2Web vulnerability seminar2
Web vulnerability seminar2Sakuya Izayoi
 
자바8 람다 나머지 공개
자바8 람다 나머지 공개자바8 람다 나머지 공개
자바8 람다 나머지 공개Sungchul Park
 
SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8Sangmin Lee
 
Data Mining with R CH1 요약
Data Mining with R CH1 요약Data Mining with R CH1 요약
Data Mining with R CH1 요약Sung Yub Kim
 
R 프로그래밍 기본 문법
R 프로그래밍 기본 문법R 프로그래밍 기본 문법
R 프로그래밍 기본 문법Terry Cho
 
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 자바8 람다 나머지 이야기 (박성철)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 자바8 람다 나머지 이야기 (박성철)2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 자바8 람다 나머지 이야기 (박성철)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 자바8 람다 나머지 이야기 (박성철)JiandSon
 
(망작)이것이 자바다 Chap.16 스트림&병렬처리 Stream&parallel processing(java)
(망작)이것이 자바다 Chap.16 스트림&병렬처리 Stream&parallel processing(java)(망작)이것이 자바다 Chap.16 스트림&병렬처리 Stream&parallel processing(java)
(망작)이것이 자바다 Chap.16 스트림&병렬처리 Stream&parallel processing(java)MIN SEOK KOO
 
[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3
[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3
[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3Seok-joon Yun
 
Functional programming
Functional programmingFunctional programming
Functional programmingssuserdcfefa
 

Similar to 스트림Api 스터디 2일 (20)

2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
 
자바8 스트림 API 소개
자바8 스트림 API 소개자바8 스트림 API 소개
자바8 스트림 API 소개
 
나에 첫번째 자바8 람다식 지앤선
나에 첫번째 자바8 람다식   지앤선나에 첫번째 자바8 람다식   지앤선
나에 첫번째 자바8 람다식 지앤선
 
MapReduce 실행 샘플 (K-mer Counting, K-means Clustering)
MapReduce 실행 샘플 (K-mer Counting, K-means Clustering)MapReduce 실행 샘플 (K-mer Counting, K-means Clustering)
MapReduce 실행 샘플 (K-mer Counting, K-means Clustering)
 
자바8강의 0강. java8 overview
자바8강의 0강. java8 overview자바8강의 0강. java8 overview
자바8강의 0강. java8 overview
 
Java stream v0.1
Java stream v0.1Java stream v0.1
Java stream v0.1
 
Java stream v0.1
Java stream v0.1Java stream v0.1
Java stream v0.1
 
Java Annotation과 MyBatis로 나만의 ORM Framework을 만들어보자
Java Annotation과 MyBatis로 나만의 ORM Framework을 만들어보자Java Annotation과 MyBatis로 나만의 ORM Framework을 만들어보자
Java Annotation과 MyBatis로 나만의 ORM Framework을 만들어보자
 
(재직자환급교육/사업주위탁/IT실무교육/구로IT학원/오라클교육/SQL기초강좌/IT강좌)#10.SQL초보에서 Schema Objects까지
(재직자환급교육/사업주위탁/IT실무교육/구로IT학원/오라클교육/SQL기초강좌/IT강좌)#10.SQL초보에서 Schema Objects까지(재직자환급교육/사업주위탁/IT실무교육/구로IT학원/오라클교육/SQL기초강좌/IT강좌)#10.SQL초보에서 Schema Objects까지
(재직자환급교육/사업주위탁/IT실무교육/구로IT학원/오라클교육/SQL기초강좌/IT강좌)#10.SQL초보에서 Schema Objects까지
 
Web vulnerability seminar2
Web vulnerability seminar2Web vulnerability seminar2
Web vulnerability seminar2
 
자바8 람다 나머지 공개
자바8 람다 나머지 공개자바8 람다 나머지 공개
자바8 람다 나머지 공개
 
SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8
 
Data Mining with R CH1 요약
Data Mining with R CH1 요약Data Mining with R CH1 요약
Data Mining with R CH1 요약
 
R 프로그래밍 기본 문법
R 프로그래밍 기본 문법R 프로그래밍 기본 문법
R 프로그래밍 기본 문법
 
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
 
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 자바8 람다 나머지 이야기 (박성철)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 자바8 람다 나머지 이야기 (박성철)2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 자바8 람다 나머지 이야기 (박성철)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 자바8 람다 나머지 이야기 (박성철)
 
(망작)이것이 자바다 Chap.16 스트림&병렬처리 Stream&parallel processing(java)
(망작)이것이 자바다 Chap.16 스트림&병렬처리 Stream&parallel processing(java)(망작)이것이 자바다 Chap.16 스트림&병렬처리 Stream&parallel processing(java)
(망작)이것이 자바다 Chap.16 스트림&병렬처리 Stream&parallel processing(java)
 
Redis edu 2
Redis edu 2Redis edu 2
Redis edu 2
 
[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3
[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3
[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3
 
Functional programming
Functional programmingFunctional programming
Functional programming
 

스트림Api 스터디 2일

  • 2. 스트림API의 소개 List<Dish> lowCaloricDishes = new ArrayList<>(); for (Dish d : menu) { if (d.getCalories() < 400) { lowCaloricDishes.add(d); } } Collections.sort(lowCaloricDishes, new Comparator<Dish>() { @Override public int compare(Dish d1, Dish d2) { return Integer.compare(d1.getCalories(), d2.getCalories()); } }); List<String> lowCaloricDishesName = new ArrayList<>(); for (Dish d : lowCaloricDishes) { lowCaloricDishesName.add(d.getName()); } 컬렉션을 다뤄야 할 일이 많지만..
  • 3. 스트림API의 소개 SELECT name FROM dishes WHERE calorie < 400 ORDER BY calorie; List<String> lowCaloricDishesName = menu.stream() .filter(d -> d.getCalories() > 400) .sorted(comparing(Dish::getCalories)) .map(Dish::getName) .collect(toList());
  • 4. 함수형 스타일 코드는 변수의 명시적인 변경이나 재할당 문제를 피할 수 있다 서술적인 코드 작성이 가능하다 간결하다 직관적이다 명령형 -> 서술형
  • 5. 스트림API의 특징은 List<String> lowCaloricDishesName = menu.parallelStream() .filter(d -> d.getCalories() > 400) .sorted(comparing(Dish::getCalories)) .map(Dish::getName) .collect(toList()); 선언형 조립할 수 있음 병렬화
  • 6. 스트림과 컬렉션 컬렉션 : 모든 값을 메모리에 저장하는 자료구조 스트림 : 요청할 때만 요소를 계산 예) 스트리밍 영화, 소수 계산 1) 딱 한 번만 탐색할 수 있다 List<String> title = Arrays.asList(...); Stream<String> s = title.stream(); s.forEach(System.out::println); s.forEach(System.out::println); //java.lang.IllegalStateException LSA에서는 예외는 발생하지 않는다. 그러 나 다시 반복되지 않고 바로 연산이 끝나기 때문에 한 번만 탐색할 수 있는 것은 동일하 다
  • 7. 스트림과 컬렉션 2) 외부 반복과 내부 반복 내부에서 병렬 처리가 가능해 지고 최적화된 순서로 처리할 수 있다
  • 8. 스트림 연산 중간 연산 - 다른 스트림을 반환 - 게으르다 최종 연산
  • 9. 중간 연산 List<String> dishes = Arrays.asList("pork", "beef", "chicken", "fish", "shoes"); List<String> names = dishes.stream() .filter(d -> { System.out.println("filtering " + d); return d.length() > 2; }) .map(d -> { System.out.println("mapping " + d); return d; }) .limit(3).collect(Collectors.toList()); System.out.println(names); filtering pork mapping pork filtering beef mapping beef filtering chicken mapping chicken [pork, beef, chicken]
  • 11. 스트림 생성과 forEach Collection.stream() Iterable.forEach() Stream.forEach() 아래 리스트를 forEach()로 출력해 보세요 (System.out.println) List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); LSA에서는 Stream.of()를 사용
  • 12. 스트림 생성과 forEach List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); System.out.println("JAVA8"); list.forEach(System.out::println); list.stream().forEach(System.out::println); System.out.println("LSA"); Stream.of(list).forEach(System.out::println);
  • 13. filter(), distinct(), limit(), skip() Stream<T> Stream<T>.filter(Predicate<? super T> var1) - boolean 반환하는 람다 아래 리스트에서 처음 3개는 무시, 그 다음 20개만, 짝수인 것만, 중복 제거해서 System.out.println으로 출력해 보세요 List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 7, 6, 5, 4, 3, 2, 1);
  • 14. filter(), distinct(), limit(), skip() List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 7, 6, 5, 4, 3, 2, 1); System.out.println("JAVA8"); list.stream().skip(3).limit(20).filter(v -> v % 2 == 0).distinct() .forEach(System.out::println); System.out.println("LSA"); Stream.of(list).skip(3).limit(20).filter(v -> v % 2 == 0).distinct() .forEach(System.out::println);
  • 15. map() Stream<R> Stream<T>.map(Function<? super T, ? extends R> var1) - T를 R로 만들어 주는 람다 아래 리스트에서 짝수만 골라서 각각 제곱한 결과를 System.out.println으로 출력해 보세요 (System.out.println) List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
  • 16. map() List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); System.out.println("JAVA8"); list.stream().filter(v -> v % 2 == 0).map(v -> v * v).forEach(System.out::println); System.out.println("LSA"); Stream.of(list).filter(v -> v % 2 == 0).map(v -> v * v).forEach(System.out::println);
  • 19. anyMatch(), allMatch(), noneMatch() Predicate를 확인해서 boolean 리턴 아래 리스트를 이용해서 *Match()를 확인해 보세요 List<Integer> list = Arrays.asList(0, 1);
  • 20. findAny() List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); Optional<Integer> optional = list.stream().filter(v -> v % 2 == 0).findAny(); optional.ifPresent(v -> System.out.println("JAVA8: " + v)); int ret = list.stream().filter(v -> v < 0).findAny().orElse(-1);
  • 21. findFirst() 반환 순서가 상관없다면 병렬 스트림에서는 findAny() List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); Optional<Integer> optional = list.stream().filter(v -> v % 2 == 0).findAny(); optional.ifPresent(v -> System.out.println("JAVA8: " + v)); 병렬 스트림으로 실행해 봅시다
  • 22. findAny() List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); Optional<Integer> optional = list.stream().filter(v -> v % 2 == 0).findAny(); optional.ifPresent(v -> System.out.println("JAVA8: " + v)); 위의 코드를 LSA로 작성해 보세요 병렬 스트림을 지원하지 않는다!!!
  • 24. reduce() List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); reduce()로 최소값을 찾아 보세요 초기값이 없으면?
  • 25. reduce() List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); int min = list.stream().reduce(100, Math::min); System.out.println("JAVA8: " + min); min = Stream.of(list).reduce(100, Math::min); System.out.println("LSA: " + min);

Editor's Notes

  1. 장황한 이론 설명은 생략 일반적으로 많이 보는 코드이지만, 매번 반복되는 군더더기 코드를 줄일 수 없을까?
  2. SQL에서는 루프나 임시 변수, 병렬화를 고민하지 않는다 결국 이런 형태 : RxJava를 맛보았기 때문에 익숙할 것이다