일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- js datepicker
- 프로그래머스 MYSQL
- CRUD게시판만들기
- 2020정보처리기사실기요약
- 자바 정규표현식 예제
- PLSQL
- 프로그래머스 SQL
- 스프링 CRUD게시판
- 정보처리기사실기정리
- 게시판만들기
- 오라클설치
- html기초
- 프로그래머스 쿼리문
- Oracle기초
- 스프링게시판만들기
- 오버라이딩
- 자바기초
- spring crud게시판
- 스프링 crud
- jsp 날짜팝업
- jsp 팝업띄우기
- 2020정보처리기사실기정리
- 날짜지정팝업
- 자바배열예제
- 정처기실기정리
- spring crud
- jsp게시판만들기
- 자바연산자
- crud게시판
- 2020정보처리기사실기
- Today
- Total
영보의 SystemOut.log
[Java] 람다식(Lambda Expressions) / 스트림(Stream) / 예제 본문
자바/스프링 기반 디지털 융합 웹 개발자 양성과정 7일차
람다식(Lambda Expressions)
- 현대적 프로그래밍 기법 = 객체지향 프로그래밍 + 함수적 프로그래밍
- 자바 8버전부터 함수적 프로그래밍 지원
# java에서 람다식을 수용한 이유
1) 코드가 매우 간결
2) 컬렉션 요소(대용량 데이터)를 필터링하거나 매핑해서 원하는 결과 쉽게 집계 가능
함수적 프로그래밍 기법을 자바에 접목시키자!
y = f(x)
( ) -> { };
x y
(타입 매개변수, . . .) -> { 실행문; . . .}
스트림(Stream)
자바 8부터 추가된 컬렉션(배열 포함)의 저장 요소를 하나씩 참조해서 람다식(함수적스타일)으로 처리할 수 있도록 해주는 반복자이다.
# 스트림의 특징
1. 람다식으로 요소 처리 코드를 제공한다.
2. 내부 반복자를 사용하므로 병렬처리가 쉽다.
→ 내부 반복자를 사용해서 얻는 이점은
컬렉션 내부에서 어떻게 요소(즉, 객체)를 반복시킬 것인가는 컬렉션에게 맡겨두고, 개발자는 요소처리 코드에만 집중할 수 있다.
3. 스트림은 '중간처리'와 '최종처리'를 할 수 있다.
# 스트림을 얻어오는 방법
내용 | 방법 |
컬렉션으로부터 스트림 얻기 | List 컬렉션의 참조변수를 통해서 |
배열로부터 스트림 얻기 | Arrays.stream(String[ ] 참조변수); |
숫자범위로부터 스트림 얻기 | IntStream.range(1, 100); |
Random 클래스 객체의 ints() 메소드로부터 스트림 얻기 | IntStream intStream = new Random().ints(1, 46); |
파일로부터 스트림 얻기 | Files 또는 BufferedReader 클래스의 lines() 메소드를 통해서 스트림 얻어옴 |
람다식과 스트림 예제 1
# Integer 외부 반복자
package 람다식예제;
import java.util.*;
import java.util.stream.Stream;
public class StreamEx01 {
public static void main(String[] args) {
List<Integer> list = (List) Arrays.asList(10,20,30,40,50);
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
Integer value = iterator.next();
System.out.print(value + " ");
}
}
}
자바7 이전까지는 List<Integer>컬렉션에서 요소를 순차적으로 처리하기위해 를 사용해왔다.
# Stream 내부 반복자
package 람다식예제;
import java.util.*;
import java.util.stream.Stream;
public class StreamEx01 {
public static void main(String[] args) {
List<Integer> list = (List) Arrays.asList(10,20,30,40,50);
Stream<Integer> stream = list.stream();
// y = f(x)
stream.forEach(value -> System.out.print(value+" "));
}
}
[결론] Stream 내부 반복자는 컬렉션 내부에서 요소들을 반복시키고, 개발자는 요소당 처리해야 할 코드만 제공하는 코드 패턴을 말한다. 개발자는 요소당 처리해야 할 코드만 제공하는 코드 패턴을 말한다.
스트림 중간처리, 최종 처리 메소드들
# '중간처리' 메소드들
종류 | 메소드 |
스트림 필터링 | filter(), distinct() |
스트림 변환(매핑) | map(), mapToInt() |
스트림 제한 | limit(), skip() |
스트림 정렬 | sorted() |
스트림 연산 결과확인 (루핑) |
peek() |
# '최종처리' 메소드들
종류 | 메소드 |
요소의 출력 | forEach() |
요소의 검사(매칭) | anyMatch(), allMatch() |
요소의 검색 | findAny(), findFirst() |
요소의 통계(집계) | count(), min(), max() |
요소의 연산(집계) | sum(), average() |
요소의 수집 | collect() |
요소의 소모 | reduce() |
- 중간처리 메소드와 최종처리 메소드를 쉽게 구분하는 방법은 리턴 타입에서 처이점이 있다. 리턴타입이 스트림이면 중간처리 메소드이고, 기본 타입이거나 OptionalXXX라면 최종처리 메소드이다.
스트림 메소드 (매개변수)의 람다식 표현
filter(Predicate 람다식 표현) 메소드 mapToInt(ToIntFunction mapper) 메소드 (예) mapToInt(클래스이름::getter메서드이름) anyMatch(Predicate 람다식 표현) 메소드 forEach(Consumer 람다식 표현) 메소드 |
람다식과 스트림 예제 2
# Customer.java
package 요소처리를위한람다식예제;
import java.util.*;
public class Customer {
// 맴버변수
private String name; // 이름
private int point_score; // 포인트 점수
// 생성자
public Customer(String name, int point_score){
this.name = name;
this.point_score = point_score;
}
public String getName() {
return name;
}
public int getPoint_score() {
return point_score;
}
}
# LamdaEx.java
package 요소처리를위한람다식예제;
import java.util.*;
import java.util.stream.Stream;
public class LamdaEx {
public static void main(String[] args) {
List<Customer> list = (List) Arrays.asList(new Customer("박태호",1500),
new Customer("오수철",700));
/*
[중요] 컬렉션으로부터 스트림 얻기 => List 컬렉션의 참조변수를 통해서
*/
Stream<Customer> stream = list.stream();
stream.forEach(s -> { // {} - 한문장 이상일 때는 중괄호를 생략하면 안된다.
String name = s.getName();
int score = s.getPoint_score();
System.out.println(name + "=> " + "포인트 점수" + score + "점");
});
}
}
람다식과 스트림 예제 3
# Member.java
package 스트림응용예제;
public class Member {
public static int MALE = 0 ; // 남자
public static int FEMALE = 0 ; // 여자
private String name; // 이름
private int gender; // 성별
private int age; // 나이
// 생성자
public Member(String name, int gender, int age){
this.name = name;
this.gender = gender;
this.age = age;
}
// getter 메소드만 구현
public String getName() {
return name;
}
public int getGender() {
return gender;
}
public int getAge() {
return age;
}
}
# StreamPipelinesEx.java
package 스트림응용예제;
import java.util.*;
import java.util.stream.Stream;
/*
회원(Member) 객체에서 '남자' 회원의 평균 나이를 람다식과 스트림을 적용하여 프로그램 작성
*/
public class StreamPipelinesEx {
public static void main(String[] args ){
List<Member> list = (List) Arrays.asList(new Member("박태호",Member.MALE,30),
new Member("김연경",Member.FEMALE, 29),
new Member("손유일", Member.MALE, 32),
new Member("안재홍", Member.MALE, 27));
// [1방법] 외부 반복자를 적용하여 해결
// index를 이용하는 for문 그리고 Iterator를 이용하는 while문은 모두 외부 반복자를 이용한다
//
//
// 28
int count = 0;
double sum = 0;
for (int i = 0; i<list.size(); i++){
if(list.get(i).getGender() == Member.MALE){
sum += list.get(i).getAge();
count ++;
}
}
double ageAvg = sum/count;
// [방법2] 내부 반복자를 적용하여 해결
double avgAvg = list.stream(). // 오리지날 스트림
filter(m -> m.getGender() == Member.MALE). // 중간 처리 스트림
mapToInt(Member::getAge). // 중간 처리 스트림
average(). // 최종 처리 스트림 => 집계처리
getAsDouble();
System.out.println("남자 회원의 평균 나이 : " + ageAvg);
} // 스프링 파이프 라인
}
System.out.println("남자 회원의 평균 나이 : " + Math.ceil(ageAvg)); --> 반올림
'국비교육(아이티센 입사교육) > Java' 카테고리의 다른 글
[Java] 자바 공연 예약 어플리케이션 만들기 (0) | 2021.10.07 |
---|---|
[Java] 자바 정규표현식 사용하여 댓글 분석하기 (compile, matcher, pattern) (0) | 2021.10.07 |
[Java] 자바 스레드(Thread)개념 / 스레드 스케줄링 / 예제 (0) | 2021.10.06 |
[Java] 자바 인터페이스 / 인터페이스 구현 / 인터페이스 예제 (0) | 2021.10.05 |
[Java] 거스름돈 반환 프로그램 (0) | 2021.10.01 |