Java 8 버전에서 추가된 기능
- Lambda(람다)표현식
- Stream(스트림)
- Method Reference( 메서드 참조 )
- Optional(옵셔널)
- 날짜 관련 클래스(java.time) 추가
- Functional(함수형)인터페이스
- 인터페이스의 기본메소드(Default method)
- 병렬 배열 정렬
- StringJoiner 추가
1. Lambda( 람다 )표현식
- 익명클래스의 가독성떨어짐과 불편을 보완하기 위해 만들어졌습니다.
- 인터페이스에 메서드가 하나인 것들만 적용 가능합니다.
- 람다표현식의 구성
1. 매개 변수 목록
2. 화살표토큰(Arrow Token)
3. 처리 식
예시코드)
Calculate 인터페이스 생성
package lambdaExpression;
//@FunctionalInterface - 하나의 메서드만 선언 가능
@FunctionalInterface
interface Calculate {
int operation(int a, int b);
}
Calculate 인터페이스로 익명클래스로 구현하고 람다표현식으로도 구현했습니다.
package lambdaExpression;
public class Lambda {
//Calculate interface를 익명클래스로 구현
private void calculateClassic() {
Calculate calculateAdd = new Calculate() {
@Override
public int operation(int a, int b) {
return a + b;
}
};
System.out.println(calculateAdd.operation(1, 2));
}
//Lambda 표현식 사용
private void calculateLambda() {
/*
* Calculate 인터페이스에 메서드는 operation()
* (a,b) 부분은 매개 변수 목록 - operation메서드의 int a, int b를 매개변수로 받는다는 의미
* -> 화살표토큰(Arrow Token)
* a+b 부분은 처리 식 - a와 b의 합을 리턴한다는 의미
*/
Calculate calculateAdd = (a, b) -> a + b;
System.out.println(calculateAdd.operation(1, 2));
}
}
2. Stream( 스트림 )
- 연속된 정보를 처리하는 데 사용합니다.
예) 자바 컬랙션, 배열 스트림 사용 불가( Arrays.asList( ) 메서드로 List로 변환 후 사용하거나 stream( ) 메서드 사용 ) - Stream의 구조
- 스트림생성 - 컬렉션의 목록을 Stream객체로 변환
( java.util.stram 패키지내 Stream 인터페이스의 stream() 메서드사용 ) - 중개연산( intermediate operation ) - 생략 가능, 중간 연산부분 처리
- 종단연산( terminal operation ) - 결과를 리턴
- 스트림생성 - 컬렉션의 목록을 Stream객체로 변환
- Stream에서 제공하는 연산의 종류
filter(pred) - 데이터를 조건으로 거를 때 사용
map(mapper) - 데이터를 특정 데이터로 변환
forEach(flat-mapper) - for루프를 수행하는 것처럼 각각의 항목을 꺼냄
flatMap(comparator)
sorted(comparator) - 데이터 정렬
toArray(array-factory)
any / all / noneMatch(pred)
findFirst / Any(pred)
cumulate(binop)
reduce(binop) / reduce(base, binop)
collect(collecter) - 원하는 타입으로 데이터를 리턴
참고) Stream 생성 방법
https://codechacha.com/ko/stream-creation/
3. Method Reference( 메서드 참조 )
- 더블 콜론 사용 " : : "
예) forEach( System.out :: println );
4. Optional( 옵셔널 )
public final class Optional<T> extends Object
- java.util 패키지
- final로 선언됨 -> 자식클래스 생성 불가능
- Generic 한 클래스
- Optional의 사용목적
null 또는 실제 값을 value로 갖는 wrapper로 감싸서 NPE(NullPointerException)로부터 자유로워지기 위해 나온 Wrapper 클래스입니다. Optional은 값을 Wrapping하고 다시 풀고, null일 경우에는 대체하는 함수를 호출하는 등의 오버헤드가 있으므로 성능이 저하될 수 있습니다. 그렇기 때문에 메소드의 반환 값이 절대 null이 아니라면 Optional을 사용하지 않는 것이 성능저하가 적습니다. 즉, Optional은 메소드의 결과가 null이 될 수 있으며, 클라이언트가 이 상황을 처리해야 할 때 사용하는 것이 좋습니다.
NPE(NullPointerException)
개발을 할 때 가장 많이 발생하는 예외 중 하나가 바로 NPE(NullPointerException)입니다. NPE를 피하기 위해서는 null을 검사하는 로직을 추가해야 하는데, null 검사를 해야하는 변수가 많은 경우 코드가 복잡해집니다.
출처: https://mangkyu.tistory.com/70 [MangKyu's Diary]
- Optional클래스 사용 방법
생성자메서드로 생성하지 않습니다. empty(), of(), ofNullable() 메서드 사용합니다.
package optional;
import java.util.Optional;
import java.util.function.Supplier;
public class OptionalStudy {
//Optional Class 생성하기
private void createOptionalObject() {
//데이터가 없는 Optional 객체를 생성하려면 empty()메서드 사용
Optional<String> emptyString = Optional.empty();
String common = null;
//null이 추가될 수 있는 상황에는 ofNullable()메서드 사용
Optional<String> nullableString = Optional.ofNullable(common);
common = "common";
//반드시 데이터가 들어갈 수 있는 상황에는 of()메서드 사용
Optional<String> commonString = Optional.of(common);
}
//Optional 클래스가 비어있는지 확인하는 메서드 isPresent()
private void checkOptionalDate() {
//"sout" + tab => System.out.println();
System.out.println(Optional.of("present").isPresent()); //true
System.out.println(Optional.ofNullable(null).isPresent()); //false
}
//값을 꺼내는 방법
private void getOptionalDate(Optional<String> data) throws Exception {
String defaultValue = "default";
//get() - 가장 많이 사용, 데이터 없을 경우 null 리턴
String result1 = data.get();
//orElse() - 값이 없을 경우 기본값 지정 가능
String result2 = data.orElse(defaultValue);
Supplier<String> StringSupplier = new Supplier<String>() {
@Override
public String get() {
return "GodOfJava";
}
};
//orElseGet() - Supplier<T> 인터페이스 활용
String result3 = data.orElseGet(StringSupplier);
Supplier<Exception> exceptionSupplier = new Supplier<Exception>() {
@Override
public Exception get() {
return new Exception();
}
};
//orElseThrow() - Supplier<T> 인터페이스 활용, 데이터가 없을 경우 예외발생시킬 수 있다.
String result4 = data.orElseThrow(exceptionSupplier);
}
}
5. 날짜 관련 클래스( java.time ) 추가
- 기존 Date 클래스 mutable class로 thread-safety가 낮습니다.
java8로 버전 업되면서 Time 클래스가 생겼고 immutable class (불변)로 thread-safe합니다. - Local 클래스
시간대가 없는 시간. 예) "1시" 어느 지역의 1시인지 구분되지 않습니다. - Offset 클래스
UTC(그리니치 시간대)와의 차이를 가지는 시간. 한국은 "+09:00" - Zoned 클래스
시간대(타임존). 한국은 "Asia/Seoul" - SNS에 글을 올리는 경우 저장되는 시간은 지역정보와 함께 저장되야 합니다. 글쓴이도 자신의 시간대로 보이고 글읽는이도 자신의 시간대에 올라간 시간이 보여야 합니다. - ZonedDateTime, LocalDate 클래스 추가
- DayOfWeek 클래스
요일정보가 담긴 enum class 입니다.
출처 : 자바의 신 2권
'Java' 카테고리의 다른 글
운영서비스에서 System.out.println 을 절대 쓰지 않는 이유 (0) | 2021.08.21 |
---|---|
equals 와 == 차이 (0) | 2021.08.18 |