JDK 8 에서 인터페이스에 default 메서드와 static 메서드를 추가할 수 있게 되었다.
JDK 9 에서는 private 메서드를 정의할 수 있게 되었다.
public interface Client {
void exchange();
default void get() {
logging2("before");
exchange();
logging("call get");
}
private void logging(String msg) {
System.out.println(msg);
}
private void logging2(String msg) {
System.out.println(msg);
}
}
try()
안에 실질적으로 final 변수를 넣을 수 있게 되었다.
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class TryWithResource {
public static void main(String[] args) {
BufferedReader br = Files.newBufferedReader(Paths.get("a.txt"));
try (br) {
String line = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
}
}
List<Integer> list = List.of(1,2,3);
Map<String, Integer> map = Map.of("k1", 1, "k2", 2);
Set<Integer> set = Set.of(1,2,3);
JDK8 까지는 가변인자를 이용하여 컬렉션을 만들려고 했으면 asList
등을 이용해야 했다.
int comp = Arrays.compare(a, b);
서로 같으면 0, a가 앞서면 음수, b가 앞서면 양수를 반환한다.
int firstIdx = Arrays.mismatch(a, b);
서로 달라지는 첫 index를 리턴하고, 서로 같으면 -1을 반환한다.
로컬 변수에 var
를 이용하여 타입을 생략하고 값을 할당할 수 있다.
var a = 10; // a는 int 타입
var result = new ArrayList<Integer>(); // result는 ArrayList<Integer> 타입
필드나, 메서드의 매개변수에는 var
를 사용할 수 없다.
JDK 11 에서는 람다식에서도 var를 사용할 수 있다.
isblank()
: 공백문자만 포함했는지 여부Character.isWhitespace(int)
를 사용lines()
: new line 기준으로 각 문장이 Stream 으로 반환된다.repeat()
: String str = "1".repeat(10);
과 같이 사용하면 된다strip()
, stripLeading()
, stripTrailing()
Character.isWhitespace(int)
를 사용trim()
보다 더 넓은 범위의 공백을 제거 한다.Files.writeString()
Files.writeString(Path.of("a.txt"), "String", StandardOpenOption.CREATE);
Files.readString()
String str = Files.readString(Path.of("a.txt"));
기본 인코딩은 UTF-8
이다.
indent(int n)
<R> R transform(Function<? super String, ? extends R> f)
"20220804".transform(DateUtil::toLocalDate);
class switchExample {
public static void main(String[] args) {
String grade = switch (mark) {
case 90 -> "A";
case 80 -> "B";
case 70 -> "C";
case 60 -> "D";
default -> "F";
};
}
}
switch가 값을 만들 수 없었지만, JDK 14 이후 값을 만들 수 있게 되었다.
값을 만들어 낼 수 있게 되어서 위의 예시와 같이 변수에 지정할 수 있거나 return
으로 반환할 수 있다. 하지만 값을 만드는 것이 필수가 되면서, default를 지정하게
되었다.
""" """
를 사용하여 텍스트 블록을 작성할 수 있다.
희미한 줄이 IDE에 생기고, indent를 의미한다. \
를 통하여 개행이 아닌 swap을 의미할 수 있다.
formatted()
String old = String.format("%s %s", "Hello", "World");
String v15 = "Hello %s".formatted("World");
코드가 좀 더 짧..? 간결해졌다.
System.out.println(name.getFirst().toUpperCase());
라는 예시에서
NPE가 발생했다면, JDK 15에서는
java.lang.NullPointerException: Cannot invoke "String.toUpperCase()" because "name.getFirst()" is null
과 같이 어떤 위치에서 null
이 발생했는지를 알려준다.
toList()
왜 이제나옴..?.collect(Collectors.toList())
를 대체할 수 있다.mapMulti()
class instanceofExample {
public static void main(String[] args) {
if (a instanceof String s) { // s: 패턴 변수
System.out.println(s); // String type a
}
if (a instanceof String t && t.isBlank()) { // t: 패턴 변수, 바로 사용
System.out.println("blank");
}
if (!(a instanceof String b)) { // b: 패턴 변수
return; // Early return
}
System.out.println(b.toUpperCase()); // Early return 블럭 이후 패턴 변수 사용
}
}
record FullName(String first, String last) {
public String formatter() {
return first + " " + last;
}
}
class recordExample {
public static void main(String[] args) {
FullName fn = new FullName("f", "l");
fn.first();
fn.last();
}
}