2. 주요 특징
• 람다식(Lambda Expression)
• 스트림(Stream) API
• 기본 메서드(Default Method)
• 자바스크립트 엔진 -> Nashorn
• 날짜 API 변경(JSR 310)
• 동시성 API 개선
• IO/NIO 확장
• 제너릭 타입의 생략가능
3. 함수형 프로그래밍
• 함수형 프로그래밍은 대입문 없이 프로그래밍 하는 것?
• Clojure
(take 25 (squares-of (integers)))
• 참조 투명성
• 멀티코어
• 동시성
• 변수 X
4. 람다식(Lambda Expression)
• 함수를 변수에 할당, 인자로 넘길수 있는 표기법
• 익명메서드
• 문법
람다 매개변수 -> 람다 본문
• 함수형 인터페이스(Functional Interface)
메서드가 하나뿐인 인터페이스
• Java.util.function 에 범용으로 쓸수있는 다양한 인터페이스가 준비되어있
다.
5. 람다식 기본문법
• (타입 매개변수, …) -> {실행문; …}
• 매개 변수의 이름은 자유
• 매개 변수의 타입은 생략할 수 도 있다.
• 하나의 매개 변수 () 생략가능, 하나의 실행문 {} 생략가능
• 매개변수가 없다면 ()를 반드시 사용해야한다.
• {} 를 사용하고 결과값을 리턴해야 하는 경우 return 작성
6. 람다식
• (int x, int y) -> { return x + y; }
• (x, y) -> x + y
• x -> x * x
• (x, y) -> { return x + y; }
• x -> { System.out.println(x); }
• () -> { System.out.println(“안녕하세요”); }
7. 함수형 인터페이스
• 추상 메서드가 1개인 인터페이스
public interface Comparator<T>{
int compare(T o1, T o2)
}
Comparator<Long> comp = (Long o1, Long o2)
-> o2 – o1 < 0 ? -1 : 1
8. 함수형 인터페이스
• @FunctionalInterface 어노테이션
두개 이상의 추상메소드가 선언되지 않도록 컴파일러가 강제
• 실수로 두 이상의 추상메소드를 선언하는걸 방지
• @FunctionalInterface
public interface MyFunctionalInterface {
public void method1();
public void method2(); // 오류!!
}
9. 함수형 인터페이스 와 대상 타입
• 람다식은 인터페이스 변수에 대입 즉,
람다식은 인터페이스의 익명 구현 객체를 생성한다는 뜻
• @FunctionalInterface
public interface MyFunctionalInterface3 {
public void method();
}
• FunctionalInterface myFunction = () -> { System.out.print(“작동!”); }
• myFunction.method();
10. 클래스 멤버 변수 와 로컬 변수
• 클래스의 멤버(필드와 메소드) 및 로컬 변수 사용가능
• 람다식에서 this는 내부적으로 생성되는
익명 객체의 참조가 아니라 람다식을 실행한 객체의 참조
• 로컬 변수의 사용에는 제약 사항이 따름
메소드의 매개 변수 또는 로컬 변수를 사용하면
이 두 변수는 final 특성을 가져야한다.
11. 인터페이스의 변화
• 기본 메서드(Default Method)
• 인터페이스에 구현된 메서드를 작성하여 오버라이드 하지않아도 기본 구현물 제공
• 하위호환성 문제 해결
• 정적 메서드의 추가 가능
• public interface myInterface{
public abstract void run();
public default void defaultStop(){
System.out.print(“Stop”);
}
public static void call(){
System.out.print(“call”);
}
}
12. 인터페이스의 변화
• 기본 메서드는 여러 개 작성가능
• 여러 인터페이스를 구현할 경우 같은 기본 메서드에 모호함에 주의할 것
• 오버라이드를 통해 해결하거나
• Super를 지정하여 디폴트 메소드를 호출.
• C++에서의 다중상속으로 인한 문제점이 발생할 수 있음
13. 스트림(Stream)
• 집계 연산을 지원하는 소스의 개체 시퀀스(????)
• 지연 연산
• 병렬 처리
• 종류
• Stream<T> : 범용 스트림
• IntStream : 값 타입이 int 인 스트림
• LongStream : Long
• DoubleStream : Double
14. 스트림(Stream)
• 스트림 의 세 단계 구성
• A.stream().filter(x -> x > 100).count();
1.스트림생성 2. 중개연산 3.종단연산
(변환) (사용)
15. 스트림과 컬렉션의 차이
• 스트림은 요소들을 보관하지 않는다. 요소들은 하부의 컬렉션에 보관되거
나 필요할 때 생성된다.
• 스트림 연산은 원본을 변경하지 않는다. 대신 결과를 담은 새로운 스트림
을 반환한다.
• 스트림 연산은 가능하면 지연(lazy) 처리된다. 지연 처리란 결과가 필요하
기 전에는 실행되지 않음을 의미한다. 예를 들어, 긴 단어를 모두 세는 대
신 처음 5개 긴 단어를 요청하면, filter 메서드는 5번 째 일치 후 필터링을
중단한다. 결과적으로 무한 스트림도 만들 수 있다.
16. 스트림(Stream) 사용시 주의할 점
• 스트림은 재사용 할 수 없다.
• intStream stream = IntStream.of(1, 2);
stream.forEach(x -> System.out::println(x));
stream.forEach(x -> System.out::println(x)); // 오류!!
• 무한 스트림에 주의
17. 기존 날짜 API 문제점들
• 기존 java.util.Calendar 클래스와 java.util.Date에 많은 문제점들
• 일관성이 없고,
• not immutable,
• int 상수 필드의 남용,
• Calendar와 Date 클래스의 혼용등등…
• (참고)
• 대부분의 프로젝트에서 Joda-Time등 다른 외부 라이브러리를
사용
18. 날짜 API 개선
• 새로운 Java.Time 패키지 추가
• DateTime 클래스대신 ZoneDateTime 클래스
• 요일 클래스는 Enum 상수로 제공
• 생성자 대신 of() 메서드 같은 static factory 메서드
• 밀리초(millisecond)단위의 정확에서 나노초(nanosecond)로 더
정확해짐
• 시계의 개념 추가(java.time.Clock)
• JDBC 대부분 지원
19. IO/NIO API의 확장
• Files에 스트림을 반환하는 메서드가 몇가지 추가
• Base64 인코딩과 디코딩이 자바 표준API로 추가(java.util.Base64)
참고
• BufferedReader.lines ()
• Files.list (Path)
• Files.walk (Path, int FileVisitOption ...)
• Files.walk (Path, FileVisitOption ...)
• Files.find (Path, int BiPredicate, FileVisitOption ...)
• Files.lines (Path, Charset)
• DirectoryStream.stream ()
22. 그 외…
• Java FX 8
• Concurrency API의 확장(동시성 API)
• 리플렉션과 어노테이션의 변경
• List<@Nullable String>과 같이 제네릭 변수에 어노테이션 가능
• Nashorn JavaScript엔진
• Rhino -> Nashorn 으로 변경되어 성능과 메모리관리 개선
23. 참고
• 책
• Java 8 Lambdas
• Java 8 in Action (번역본도 있습니다.)
• 가장 빨리 만나는 자바 8
• 사이트
• http://blog.fupfin.com/?p=27
• http://www.moreagile.net/2014/04/AllAboutJava8.html
• http://d2.naver.com/helloworld/645609
(기존 날짜 API 문제점과 변경점)
• https://docs.oracle.com/javase/8/docs/api/ 공식 API 문서