public String getTypeOfDayWithSwitchStatement(String dayOfWeekArg) {
String typeOfDay;
switch (dayOfWeekArg) {
case "Monday":
typeOfDay = "Start of work week";
break;
case "Tuesday":
case "Wednesday":
case "Thursday":
typeOfDay = "Midweek";
break;
case "Friday":
typeOfDay = "End of work week";
break;
case "Saturday":
case "Sunday":
typeOfDay = "Weekend";
break;
default:
throw new IllegalArgumentException("Invalid day of the week: " + dayOfWeekArg);
}
return typeOfDay;
}
float pi1 = 3_.1415F; // Invalid;
float pi2 = 3._1415F; // Invalid;
long socialSecurityNumber1
= 999_99_9999_L; // Invalid;
int x2 = 5_2; // OK (decimal literal)
int x3 = 52_; // Invalid;
int x4 = 5_______2; // OK (decimal literal)
int x5 = 0_x52; // Invalid;
int x6 = 0x_52; // Invalid;
int x7 = 0x5_2; // OK (hexadecimal literal)
int x8 = 0x52_; // Invalid;
int x9 = 0_52; // OK (octal literal)
int x10 = 05_2; // OK (octal literal)
int x11 = 052_; // Invalid;
// 7 버전 이전
List<String> list = new ArrayList<String>();
// 7 버전 이후
List<String> list = new ArrayList<>();
interface DefaultInterface {
public void something();
default void show() {
...
}
}
interface Movable {
void move(String param);
}
class Car implements Movable {
@Override
public void move(String param) {
...
}
}
Moveable movable = new Movable() {
@Override
public void move(String param) {
...
}
}
아래와 같이 람다 표현식으로 구현하기 위해서는 추상 method가 1개여야만한다.
@FunctionalInterface
는 추상 method가 1개임을 나타내는 것이고, 추상 method가 1개가 아닐 경우 compile error가 발생한다.
@FunctionalInterface
interface Moveable {
void move(String param);
}
Moveable moveable = (param) -> {
...
}
Moveable moveable = param -> ...;
null이 될 수도 있는 객체
를 감싸고 있는 wrapper class입니다.
NPE(NullPointerException)을 예방할 수 있습니다.
method | desc |
---|---|
get() | 객체 반환. 비어있으면 NoSuchElementException |
orElse(T other) | 객체가 비어있으면 other 반환 |
orElseGet(Supplier<? extends T> other) | 객체가 비어있는 경우에만 함수가 호출되기 때문에 orElse 대비 성능상 이점을 기대할 수 있음 |
orElseThrow(Supplier<? extends X> exceptionSupplier) | 비어있는 객체에 대해 예외를 던짐 |
@Getter
public class Computer {
private Speaker speaker;
}
@Getter
public class Speaker {
private String name;
}
// computer의 speaker가 null이면 NPE발생
String speakerName = computer.getSpeaker().getName();
// null 체크
if(computer != null && computer.getSpeaker() != null ...) {
...
}
// optional
String speakerName = Optional.ofNullable(computer)
.map(Computer::getSpeaker)
.map(Speaker::getName)
.orElse("none");
추가된 API | Desc |
---|---|
java.time.LocalDate | 날짜. 타임존 사용 X |
java.time.LocalTime | 시간. 타임존 사용 X |
java.time.LocalDateTime | 날짜 및 시간. 타임존 사용 X |
java.time.ZonedDateTime | 날짜 및 시간. 타임존 사용 O |
java.time.DateTimeFormatter | java.time에 대한 형식 |
java.time.Duration | 시간을 초/나노초 단위로 측정 |
java.time.Period | 시간을 년/월/일 단위로 측정 |
java.time.TemporalAdjuster | 날짜 조정 |
LocalDate date = LocalDate.now(); // 오늘 날짜
LocalDate date = LocalDate.of(2021, 12, 23); // 2021-12-23
LocalDate date = LocalDate.parse("2021-12-23"); // 2021-12-23
LocalDateTime datetime = LocalDateTime.of(2021, 12, 23, 0, 0, 0);
datetime.plusMonths(1);
datetime.plusWeeks(1);
datetime.plusDays(1);
datetime.plusHours(1);
datetime.minusMinutes(1);
Peramanent Heap 영역이 제거되고, Metasapce Native Memory 영역이 추가되었다.
collection, array등 요소들을 하나씩 참조하며 반복처리하는 기능으로 3단계를 거쳐 동작합니다.
1. stream 생성
2. stream 중개 연산(변환, 가공)
3. stream 최종 연산
중개 연산 | Desc |
---|---|
filter | 주어진 조건에 맞는 요소만 새로운 stream 반환 |
distinct | 중복된 요소가 제거된 새로운 stream 반환. 내부적으로 equals() 사용 |
map | 특정 값으로 변환 |
flatMap | stream요소가 배열일 경우, 각 요소를 함수로 전달하여 반환값으로 이뤄진 새로운 stream 반환 |
limit | 첫 번째 요소부터 n개만큼 새로운 stream 반환 |
skip | 첫 번째 요소부터 n개만큼 제외하고 새로운 stream 반환 |
sorted | ,,, |
List<Integer> list = Arrays.asList(1, 2, 3, 3, 4, 4);
Stream<Integer> stream = list.stream().distinct(); // 1, 2, 3, 4
Stream<Integer> stream = list.stream().filter(num -> num % 2 == 0); // 2, 4, 4
List<String> list = Arrays.asList("Java", "Kotlin", "Scala");
Stream<Integer> stream = list.stream().map(String::length); // 4, 6, 5
Stream<String> stream = list.stream().map(String::upperCase); // JAVA, KOTLIN, SCALA
List<String> list = Arrays.asList("Java", "C", "Python");
list.stream().sorted().collect(Collectors.toList());
list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
Gradle, Maven과 같은 Module시스템으로 Application에서 필요한 Module만 명시할 수 있게 되었다.
public interface Interface {
private void method() {
...
}
private static void method() {
...
}
}
타입추론 변수. 컴파일러가 타입 추론
var list = new ArrayList<String>(); // ArrayList<String>
var numbers = List.of(1, 2, 3, 4, 5); // List<Integer>
Java 9의 Concurrent collector가 parallel collector보다 full GC속도가 느림.
따라서 Java 10부터 single thread기반 full gc를 parallel full gc로 변경
GC동작으로 인해
stop-the-world(GC thread 외 모든 thread가 멈춤)
가 발생하는데,
모든 thread가 동시에 멈추지 않고, 개별로 멈출 수 있게 되었다.
일시 중지 시간을 10ms 미만으로 유지. 대량의 메모리를 low-latency로 처리하기 위해 디자인 됨
latency overhead를 줄이는 것이 목적
switch(day) {
case MONDAY:
case FRIDAY:
case SUNDAY:
System.out.println(6);
break;
case TUESDAY:
System.out.println(7);
break;
case THURSDAY:
case SATURDAY:
System.out.println(8);
break;
case WEDNESDAY:
System.out.println(9);
break;
}
switch (day) {
case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
case TUESDAY -> System.out.println(7);
case THURSDAY, SATURDAY -> System.out.println(8);
case WEDNESDAY -> System.out.println(9);
}
줄바꿈 문자가 자동으로 포함됩니다.
String str = """
This
is
text block
""";