SlideShare a Scribd company logo
1 of 12
Download to read offline
by 홍석주 2022.07.19
Java 8
함수형 인터페이스, 인터페이스 변화, Stream
함수형 인터페이스 도입 이유
함수형 프로그래밍을 하기 위해!
함수형 프로그래밍의 장점
• 함수를 First Class Object 로 사용 가능

• 순수 함수(Pure Function)

• 고차 함수(High-Order Function)
함수형 인터페이스 도입
@FunctionalInterface - 명시해주기
@FunctionalInterface
public interface RunSomething {
int run(int a, int b);
}
함수형 인터페이스는 추상 메서드가 “하나”만 있어야 한다!!

SAM = Single Abstract Method

디폴트 메서드나, 스태틱 메서드는 있어도 됨
public static void main(String[] args) {
RunSomething runSomething = new RunSomething() {
@Override
public int run(int a, int b) {
return a + b;
}
};
}
함수형 인터페이스 정의 익명 클래스를 통해 구현
함수형 인터페이스 도입
람다 사용
public static void main(String[] args) {
RunSomething runSomething = new RunSomething()
{
@Override
public int run(int a, int b) {
return a + b;
}
};
}
람다를 활용하면 코드의 가독성을 높일 수 있다.
public static void main(String[] args) {
RunSomething runSomething = (a, b) -> a + b;
int run = runSomething.run(3, 4);
System.out.println("run = " + run);
}
익명 클래스를 통해 구현 람다를 통해 구현
자바8에서 제공해주는 인터페이스
맨날 만들기 번거롭잖아
Function<Integer, Integer> sum = a -> a + 5;
Function<Integer, Integer> multiply = a -> a * 2;
System.out.println(sum.apply(10)); // 15
System.out.println(multiply.apply(10)); // 20
System.out.println(sum.compose(multiply).apply(10)); // 25
System.out.println(sum.andThen(multiply).apply(10)); // 30
UnaryOperator<Integer> sumU = a -> a + 6;
UnaryOperator<Integer> multiplyU = a -> a * 2;
System.out.println(sumU.apply(10)); // 16
System.out.println(multiplyU.apply(10)); //20
System.out.println(sumU.compose(multiplyU).apply(10)); // 26
System.out.println(sumU.andThen(multiplyU).apply(10)); // 32
Function<T, R> - 타입 T를 입력받아 R로 반환, UnaryOperator<T> - T를 받아 T로 반환
자바8에서 제공해주는 인터페이스
맨날 만들기 번거롭잖아
Consumer<Integer> consumer = a -> System.out.println(a + 10);
consumer.accept(20);
Supplier<String> supplier = () -> "HELLO";
System.out.println(supplier.get());
Predicate<String> predicate = s -> s.contains("hello");
boolean result = predicate.test("seokju says bye");
System.out.println(result);
Consumer<T> - T를 입력받아 , Supplier<T> - T를 반환
Predicate<T> - boolean 반환
이 인터페이스들이 Stream에서 아주 요긴하게 쓰인다!
인터페이스 변화
Default Method & Static Method
• 과거 인터페이스는 추상 메서드로만 구성되어 있어야 함. 

Concrete Class에서 구현해줘야 함.

• 공통되는 부분이 있음에도, 각각 구현해서 만들어줘야 했음

• 자바8부터는 Default 메서드를 통해 공통된 메서드를 제공하고, 스태틱 메서드
를 통해 편의 기능도 제공할 수 있다.
인터페이스 변화
Diamond Problem
Foo Bar
Something
두 개 이상의 인터페이스에서 같은 메서드가 있는 경우엔 Concrete에서 오버라이딩 해줘야 함!
스트림
필터하고, 조작하고, 내놓기!
스트림 종류
걸러내기
• Filter(Predicate) 

• 예) 이름이 3글자 이상인 데이터만 새로운 스트림으로 

변경하기
• Map(Function) 또는 FlatMap(Function) 

• 예) 각각의 Post 인스턴스에서 String title만 새로운 스트림으로 

• 예) List<Stream<String>>을 String의 스트림으로 

생성하기
• generate(Supplier) 또는 Iterate(T seed, UnaryOperator) 

• 예) 10부터 1씩 증가하는 무제한 숫자 스트림 

• 예) 랜덤 int 무제한 스트림 

제한하기
• limit(long) 또는 skip(long) 

• 예) 최대 5개의 요소가 담긴 스트림을 리턴한다. 

• 예) 앞에서 3개를 뺀 나머지 스트림을 리턴한다.
스트림 종류
스트림에 있는 데이터가 특정 조건을 만족하는지 확인
• anyMatch(), allMatch(), nonMatch() 

• 예) k로 시작하는 문자열이 있는지 확인한다. (true 또는 false를 리턴한다.) 

• 예) 스트림에 있는 모든 값이 10보다 작은지 확인한다. 

개수 세기
• count() 

• 예) 10보다 큰 수의 개수를 센다. 

스트림을 데이터 하나로 뭉치기
• reduce(identity, BiFunction), collect(), sum(), max() 

• 예) 모든 숫자 합 구하기 

• 예) 모든 데이터를 하나의 List 또는 Set에 옮겨 담기
스트림 테스트
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(i -> i.getTitle().startsWith("spring")).forEach(s -> System.out.println(s.getTitle()));
System.out.println("close 되지 않은 수업");
// springClasses.stream().filter(i -> !i.isClosed()).forEach(s -> System.out.println(s.getTitle()));
springClasses.stream().filter(Predicate.not(OnlineClass::isClosed)).forEach(s -> System.out.println(s.getTitle()));
System.out.println("수업 이름만 모아서 스트림 만들기");
springClasses.stream().map(OnlineClass::getTitle).forEach(System.out::println);

More Related Content

Similar to 자바8정리.pdf

Swift3 generic
Swift3 genericSwift3 generic
Swift3 genericEunjoo Im
 
Java jungsuk3 ch14_lambda_stream
Java jungsuk3 ch14_lambda_streamJava jungsuk3 ch14_lambda_stream
Java jungsuk3 ch14_lambda_stream성 남궁
 
Java collections framework
Java collections frameworkJava collections framework
Java collections framework경주 전
 
Java8 - Oracle Korea Magazine
Java8 - Oracle Korea MagazineJava8 - Oracle Korea Magazine
Java8 - Oracle Korea MagazineJay Lee
 
자바8강의 2강. Stream API
자바8강의 2강. Stream API자바8강의 2강. Stream API
자바8강의 2강. Stream APISejong Park
 
SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8Sangmin Lee
 
About Visual C++ 10
About  Visual C++ 10About  Visual C++ 10
About Visual C++ 10흥배 최
 
Google Protocol buffer
Google Protocol bufferGoogle Protocol buffer
Google Protocol bufferknight1128
 
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)MIN SEOK KOO
 
11_빠른 개발 가능한 레벨 편집 시스템
11_빠른 개발 가능한 레벨 편집 시스템11_빠른 개발 가능한 레벨 편집 시스템
11_빠른 개발 가능한 레벨 편집 시스템noerror
 
Functional programming
Functional programmingFunctional programming
Functional programmingssuserdcfefa
 
C Language For Arduino
C Language For ArduinoC Language For Arduino
C Language For Arduino영욱 김
 
[224] 번역 모델 기반_질의_교정_시스템
[224] 번역 모델 기반_질의_교정_시스템[224] 번역 모델 기반_질의_교정_시스템
[224] 번역 모델 기반_질의_교정_시스템NAVER D2
 
2015 Kitel C 언어 강좌3
2015 Kitel C 언어 강좌32015 Kitel C 언어 강좌3
2015 Kitel C 언어 강좌3ssuseraf62e91
 
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)JiandSon
 
Let's Go (golang)
Let's Go (golang)Let's Go (golang)
Let's Go (golang)상욱 송
 
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 명신 김
 

Similar to 자바8정리.pdf (20)

Swift3 generic
Swift3 genericSwift3 generic
Swift3 generic
 
Java(3/4)
Java(3/4)Java(3/4)
Java(3/4)
 
Java jungsuk3 ch14_lambda_stream
Java jungsuk3 ch14_lambda_streamJava jungsuk3 ch14_lambda_stream
Java jungsuk3 ch14_lambda_stream
 
Java collections framework
Java collections frameworkJava collections framework
Java collections framework
 
JDK 변천사
JDK 변천사JDK 변천사
JDK 변천사
 
Java8 - Oracle Korea Magazine
Java8 - Oracle Korea MagazineJava8 - Oracle Korea Magazine
Java8 - Oracle Korea Magazine
 
자바8강의 2강. Stream API
자바8강의 2강. Stream API자바8강의 2강. Stream API
자바8강의 2강. Stream API
 
SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8
 
About Visual C++ 10
About  Visual C++ 10About  Visual C++ 10
About Visual C++ 10
 
Google Protocol buffer
Google Protocol bufferGoogle Protocol buffer
Google Protocol buffer
 
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
 
11_빠른 개발 가능한 레벨 편집 시스템
11_빠른 개발 가능한 레벨 편집 시스템11_빠른 개발 가능한 레벨 편집 시스템
11_빠른 개발 가능한 레벨 편집 시스템
 
Functional programming
Functional programmingFunctional programming
Functional programming
 
C Language For Arduino
C Language For ArduinoC Language For Arduino
C Language For Arduino
 
Go
GoGo
Go
 
[224] 번역 모델 기반_질의_교정_시스템
[224] 번역 모델 기반_질의_교정_시스템[224] 번역 모델 기반_질의_교정_시스템
[224] 번역 모델 기반_질의_교정_시스템
 
2015 Kitel C 언어 강좌3
2015 Kitel C 언어 강좌32015 Kitel C 언어 강좌3
2015 Kitel C 언어 강좌3
 
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
 
Let's Go (golang)
Let's Go (golang)Let's Go (golang)
Let's Go (golang)
 
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14
 

More from Seokju Hong

API 문서화.pdf
API 문서화.pdfAPI 문서화.pdf
API 문서화.pdfSeokju Hong
 
트랜잭션_인덱싱.pdf
트랜잭션_인덱싱.pdf트랜잭션_인덱싱.pdf
트랜잭션_인덱싱.pdfSeokju Hong
 
쓰레드.pdf
쓰레드.pdf쓰레드.pdf
쓰레드.pdfSeokju Hong
 
타임리프 폼과 어노테이션.Key
타임리프 폼과 어노테이션.Key타임리프 폼과 어노테이션.Key
타임리프 폼과 어노테이션.KeySeokju Hong
 
Mvc 패턴
Mvc 패턴Mvc 패턴
Mvc 패턴Seokju Hong
 

More from Seokju Hong (7)

API 문서화.pdf
API 문서화.pdfAPI 문서화.pdf
API 문서화.pdf
 
트랜잭션_인덱싱.pdf
트랜잭션_인덱싱.pdf트랜잭션_인덱싱.pdf
트랜잭션_인덱싱.pdf
 
DB Index.pdf
DB Index.pdfDB Index.pdf
DB Index.pdf
 
쓰레드.pdf
쓰레드.pdf쓰레드.pdf
쓰레드.pdf
 
validation.pdf
validation.pdfvalidation.pdf
validation.pdf
 
타임리프 폼과 어노테이션.Key
타임리프 폼과 어노테이션.Key타임리프 폼과 어노테이션.Key
타임리프 폼과 어노테이션.Key
 
Mvc 패턴
Mvc 패턴Mvc 패턴
Mvc 패턴
 

자바8정리.pdf

  • 1. by 홍석주 2022.07.19 Java 8 함수형 인터페이스, 인터페이스 변화, Stream
  • 2. 함수형 인터페이스 도입 이유 함수형 프로그래밍을 하기 위해! 함수형 프로그래밍의 장점 • 함수를 First Class Object 로 사용 가능 • 순수 함수(Pure Function) • 고차 함수(High-Order Function)
  • 3. 함수형 인터페이스 도입 @FunctionalInterface - 명시해주기 @FunctionalInterface public interface RunSomething { int run(int a, int b); } 함수형 인터페이스는 추상 메서드가 “하나”만 있어야 한다!! SAM = Single Abstract Method 디폴트 메서드나, 스태틱 메서드는 있어도 됨 public static void main(String[] args) { RunSomething runSomething = new RunSomething() { @Override public int run(int a, int b) { return a + b; } }; } 함수형 인터페이스 정의 익명 클래스를 통해 구현
  • 4. 함수형 인터페이스 도입 람다 사용 public static void main(String[] args) { RunSomething runSomething = new RunSomething() { @Override public int run(int a, int b) { return a + b; } }; } 람다를 활용하면 코드의 가독성을 높일 수 있다. public static void main(String[] args) { RunSomething runSomething = (a, b) -> a + b; int run = runSomething.run(3, 4); System.out.println("run = " + run); } 익명 클래스를 통해 구현 람다를 통해 구현
  • 5. 자바8에서 제공해주는 인터페이스 맨날 만들기 번거롭잖아 Function<Integer, Integer> sum = a -> a + 5; Function<Integer, Integer> multiply = a -> a * 2; System.out.println(sum.apply(10)); // 15 System.out.println(multiply.apply(10)); // 20 System.out.println(sum.compose(multiply).apply(10)); // 25 System.out.println(sum.andThen(multiply).apply(10)); // 30 UnaryOperator<Integer> sumU = a -> a + 6; UnaryOperator<Integer> multiplyU = a -> a * 2; System.out.println(sumU.apply(10)); // 16 System.out.println(multiplyU.apply(10)); //20 System.out.println(sumU.compose(multiplyU).apply(10)); // 26 System.out.println(sumU.andThen(multiplyU).apply(10)); // 32 Function<T, R> - 타입 T를 입력받아 R로 반환, UnaryOperator<T> - T를 받아 T로 반환
  • 6. 자바8에서 제공해주는 인터페이스 맨날 만들기 번거롭잖아 Consumer<Integer> consumer = a -> System.out.println(a + 10); consumer.accept(20); Supplier<String> supplier = () -> "HELLO"; System.out.println(supplier.get()); Predicate<String> predicate = s -> s.contains("hello"); boolean result = predicate.test("seokju says bye"); System.out.println(result); Consumer<T> - T를 입력받아 , Supplier<T> - T를 반환 Predicate<T> - boolean 반환 이 인터페이스들이 Stream에서 아주 요긴하게 쓰인다!
  • 7. 인터페이스 변화 Default Method & Static Method • 과거 인터페이스는 추상 메서드로만 구성되어 있어야 함. 
 Concrete Class에서 구현해줘야 함. • 공통되는 부분이 있음에도, 각각 구현해서 만들어줘야 했음 • 자바8부터는 Default 메서드를 통해 공통된 메서드를 제공하고, 스태틱 메서드 를 통해 편의 기능도 제공할 수 있다.
  • 8. 인터페이스 변화 Diamond Problem Foo Bar Something 두 개 이상의 인터페이스에서 같은 메서드가 있는 경우엔 Concrete에서 오버라이딩 해줘야 함!
  • 10. 스트림 종류 걸러내기 • Filter(Predicate) • 예) 이름이 3글자 이상인 데이터만 새로운 스트림으로 변경하기 • Map(Function) 또는 FlatMap(Function) • 예) 각각의 Post 인스턴스에서 String title만 새로운 스트림으로 • 예) List<Stream<String>>을 String의 스트림으로 생성하기 • generate(Supplier) 또는 Iterate(T seed, UnaryOperator) • 예) 10부터 1씩 증가하는 무제한 숫자 스트림 • 예) 랜덤 int 무제한 스트림 제한하기 • limit(long) 또는 skip(long) • 예) 최대 5개의 요소가 담긴 스트림을 리턴한다. • 예) 앞에서 3개를 뺀 나머지 스트림을 리턴한다.
  • 11. 스트림 종류 스트림에 있는 데이터가 특정 조건을 만족하는지 확인 • anyMatch(), allMatch(), nonMatch() • 예) k로 시작하는 문자열이 있는지 확인한다. (true 또는 false를 리턴한다.) • 예) 스트림에 있는 모든 값이 10보다 작은지 확인한다. 개수 세기 • count() • 예) 10보다 큰 수의 개수를 센다. 스트림을 데이터 하나로 뭉치기 • reduce(identity, BiFunction), collect(), sum(), max() • 예) 모든 숫자 합 구하기 • 예) 모든 데이터를 하나의 List 또는 Set에 옮겨 담기
  • 12. 스트림 테스트 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(i -> i.getTitle().startsWith("spring")).forEach(s -> System.out.println(s.getTitle())); System.out.println("close 되지 않은 수업"); // springClasses.stream().filter(i -> !i.isClosed()).forEach(s -> System.out.println(s.getTitle())); springClasses.stream().filter(Predicate.not(OnlineClass::isClosed)).forEach(s -> System.out.println(s.getTitle())); System.out.println("수업 이름만 모아서 스트림 만들기"); springClasses.stream().map(OnlineClass::getTitle).forEach(System.out::println);