Java 11. 주요 변경 내용
Java 11은 Java 10이 출시된지 6개월 후인 2018년 9월에 출시된 LTS 버전입니다.
var
Java 10에서 등장한 var을 람다식 매개변수에 적용 가능하게 되었습니다.
// String 타입을 명시적으로 작성해 준 람다식입니다.
Consumer<String> c1 = (String x) -> System.out.println(x);
// Java 11부터 람다식에 var을 사용할 수 있습니다.
Consumer<String> c2 = (var x) -> System.out.println(x);
String 클래스 업데이트
strip()
띄어 쓰기 혹은 탭 같은 white space를 앞 뒤로 제거해주는 함수입니다.
- stripLeading(): 앞 부분의 white space만 제거
- stripTrailing(): 뒷 부분의 white space만 제거
public static void stripExample() {
String str = " A BC ";
System.out.println(str.strip());
}
isBlank()
특정 문자열이 white space로만 구성되어 있다면 true를 반환합니다.
lines()
개행 문자를 기준으로 문자열을 쪼개 Stream<String>을 반환합니다.
public static void linesExample() {
String str = "A\nB";
str.lines()
.forEach(System.out::println);
}
repeat()
반복 횟수를 파라미터로 받아 주어진 문자열을 반복해 새로운 이어붙인 문자열을 반환합니다.
public static void repeatExample() {
String str = "A ";
System.out.println(str.repeat(3));
}
Collection API 업데이트
기존에는 컬렉션을 배열로 변환하기 위해 배열을 직접 만들어 옮겨야 했습니다.
List<String> strings = List.of("A", "B", "C");
String[] strArray = new String[3];
String[] result = strings.toArray(strArray);
Java 11에서 추가된 toArray() 함수는 배열 생성자 참조를 사용할 수 있게 되었습니다.
List<String> strings = List.of("A", "B", "C");
String[] result = strings.toArray(String[]::new);
Predicate
주어진 조건을 반대로 전환할 수 있는 기능이 추가되었습니다.
List<String> strings = List.of("A", " ", " ");
List<String> result = strings.stream()
.filter(Predicate.not(String::isBlank))
.collect(Collectors.toList());
Files 클래스 업데이트
파일 내용 전체를 문자열로 읽어 들이거나 문자열 전체를 파일에 써야 할 때 유용한 기능이 추가되었습니다. 다음은 readString() 메소드를 사용하여 Path를 받아 파일의 전체 내용을 문자열로 읽어 들이는 코드입니다. 문자열 전체를 특정 Path에 쓸 경우에는 writeString() 메소드를 사용하면 됩니다.
public static void readStringExample() throws Exception {
var path = Paths.get(Paths.get(".").toAbsolutePath() + "/xxx-api/test.txt");
String str = Files.readString(path);
System.out.println(str);
}
새로운 Http Client
Java를 이용해 HTTP 요청을 주고 받아야 할 때 사용할 수 있는 API입니다. Java 9에서 인큐베이팅 모듈로 등장하고, Java 11에서 표준 모듈로 인정되었습니다.
기존 Http Client- HttpUrlConnection
- HTTP/2.0, HTTP/1.1 지원 불가능
- 비동기 처리 불가능
- 사용하거나 유지보수하는 것이 매우 어려움
그래서 Java에서 HTTP Client가 필요한 경우, apache HttpClient, OkHttp, Jetty HttpClient 등 외부 라이브러리를 가져와 사용하였습니다.
새로운 Http Client 특징
- HTTP/2.0, HTTP/1.1 지원
- WebSocket 지원
- CompletableFuture를 이용한 비동기 매커니즘 지원
- 람다와 같은 새로운 언어 시스템에 우호적
핵심 객체
- HttpRequest
- HttpResponse<T>
- HttpClient
다음은 동기 방식으로 HttpClient를 사용한 예제 코드입니다.
public static void httpClientSyncExample() throws Exception {
var client = HttpClient.newHttpClient();
var request = HttpRequest.newBuilder(URI.create("https://postman-echo.com/get"))
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
printlnWithThread(response.statusCode());
printlnWithThread(response.body());
client.close();
}
private static void printlnWithThread(Object obj) {
System.out.printf("%s %s\n", Thread.currentThread().getName(), obj);
}
다음은 비동기 방식으로 호출한 예제 코드입니다.
public static void httpClientAsyncExample() {
var client = HttpClient.newHttpClient();
var request = HttpRequest.newBuilder(URI.create("https://postman-echo.com/get"))
.GET()
.build();
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenAccept((response) -> {
printlnWithThread(response.statusCode());
printlnWithThread(response.body());
});
client.close();
}