반응형
정리하려고 쓴글인데 https://kils-log-of-develop.tistory.com/659?category=923003 이 글이 좀 더 잘썼다. 아직 좀 더 고민이 필요한 부분이다.
람다식
함수적 프로그래밍
y=f(x)
형태의 함수로 구성된 프로그래밍 기법- 데이터를 매개값으로 전달하고, 결과를 받는 코드들로 구성
- 객체 지향 프로그래밍보다 효율적인 경우
- 대용량 처리시 유리
- 데이터 포장 객체를 생성 후 처리하는 것보다, 데이터를 바로 처리하는 것이 속도에 유리하다.
- 멀티 코어 cpu 에서 데이터를 병렬 처리하고, 취합할때, 객체보다 함수가 유리하다.
- 이벤트 지향 프로그래밍(이벤트가 발생하면 핸들러 함수 실행)에 적합
- 반복적인 이벤트 처리는 핸들러 객체보다는 핸들러 함수가 적합
- 대용량 처리시 유리
- 현대적 프로그래밍 기법
- 객체 지향 프로그래밍 + 함수적 프로그래밍
자바 8부터 함수적 프로그래밍 지원
- 람다식을 언어 차원에서 제공
- 람다 계산법에서 사용될 식을 프로그래밍 언어에 접목
- 익명함수를 생성하기 위한 식
(타입 매개변수, ..) ->{ 실행문; ...}
- 자바에서 람다식을 수용한 이유
- 코드가 매우 간결해진다.
- 컬렉션 요소(대용량 데이터)를 필터링 또는 매핑해서 쉽게 집계할 수 있다.
Stream(java 8)
- 간단하게 내부 반복자 라고 부르기도 합니다.
- 요소들을 내부적으로, 반복적으로 처리할 때 사용이 됩니다.
스트림은 반복자
컬렉션(배열 포함)의 요소를 하나씩 참조해서 람다식(java 8)으로 처리할 수 있는 반복자이다.
- 자바 7 이전 코드
List<String> list = Arrays.asList("소녀시대", "슈퍼주니어", "에스파", "트와이스");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String name = iterator.next();
System.out.println(name);
}
- 자바 8 이후 코드
List<String> list = Arrays.asList("소녀시대", "슈퍼주니어", "에스파", "트와이스");
Stream<String> stream = list.stream();
stream.forEach(name -> System.out.println(name));
스트림 특징
람다식으로 요소 처리 코드를 제공한다.
- 스트림이 제공하는 대부분의 요소 처리 메소드는 함수적 인터페이스 매개타입을 가진다.
- 매개값으로 람다식 또는 메소드 참조를 대입할 수 있다.
List<Student> list =
Arrays.asList(new Student("길재은", 100), new Student("김우소", 70), new Student("Hammer", 99));
Stream<Student> stream = list.stream();
stream.forEach(
student -> {
System.out.println(student.getName() + "-" + student.getScore());
});
내부 반복자를 사용하므로 병렬처리가 쉽다.
- 개발자는 요소 처리 코드에만 직중할 수 있다.
- 멀티 코어 CPU 를 최대한 활용하기 위해 요소들을 분배시켜 병렬 처리 작업을 할 수 있다.
- 병렬 처리
- 한 가지 작업을 서브 작업으로 나누고, 서브 작업들을 분리된 스레드에서 병렬적으로 처리한 후, 서브 작업들의 결과들을 최종 결합하는 방법
- 자바는
ForkJoinPool
프레임워크를 이용해 병렬처리 한다.
병렬처리 확인
List<Student> list =
Arrays.asList(new Student("길재은", 100), new Student("김우소", 70), new Student("Hammer", 99));
/*
Stream<Student> stream = list.stream();
stream.forEach(
student -> {
System.out.println(student.getName() + ":" + Thread.currentThread().getName());
});
*/
Stream<Student> paralleStream = list.parallelStream();
paralleStream.forEach(
student -> {
System.out.println(student.getName() + Thread.currentThread().getName());
});
스트림은 중간 처리와 최종 처리를 할 수 있다.
- 중간 처리: 요소들 매핑, 필터링, 정렬
- 최종 처리: 반복, 카운트, 평균 , 총합.
List<Student> list =
Arrays.asList(new Student("길재은", 100), new Student("김우소", 70), new Student("Hammer", 99));
System.out.println("평균:" + list.stream().mapToInt(Student::getScore).average().getAsDouble());
// 평균:89.66666666666667
스트림 종류
참고 문헌
이것이 자바다
https://www.youtube.com/watch?v=2D9NRBIKKCcdl
https://www.youtube.com/watch?v=yDlNLOu6o4s&list=PLVsNizTWUw7FPokuK8Cmlt72DQEt7hKZu&index=147
반응형
'스프링, 자바' 카테고리의 다른 글
자바 서블릿 요약 (0) | 2021.01.26 |
---|---|
jsp 데이터베이스 사용 간단 정리본 (0) | 2021.01.26 |
자바의 직렬화(Java Serialization) (0) | 2021.01.24 |
NIO 기반 입출력 및 네트워킹 (0) | 2021.01.23 |
jsp 와 세션 (0) | 2021.01.19 |