JAVA 11
기능
New String method
- String methods
line()
- LF 문자로 나누어 stream을 생성
@Test public void lf_to_stream() { String multilineStr = "This is\n \n a multiline\n string."; long lineCount = multilineStr.lines() .filter(String::isBlank) .count(); is(lineCount).equals(3L); }
trim() vs strip()
- strip은 유니코드상의 공백문자도 공백문자로 처리한다. ex
\\u2005
- trim은 Character.isWhitespace() 인 문자만 처리한다.
\n\t
New File Method
- File 에 string을 읽고쓰는게 쉬워졌다
Path filePath = Files.writeString(Files.createTempFile(tempDir, "demo", ".txt"), "Sample text"); String fileContent = Files.readString(filePath);
Collection to Array
- collection을 array로 바로 전환할수있는 메서드가 생겼다
Arrays.asList("A","B").toArray(String[]::new)
Not Predicate Method
- predicate에서 not을 반환해주는 메서드가 생겼다.
...stream() .filter(Predicate.not(String::isBlank)) ...
Local-Variable Syntax for Lambda
- 람다에서 자료형을 명시하지않고
var
를 사용할수있게 되었다. - 보통 자료형을 생략하지만, 자료형을 기입하면 어노테이션과같은 수식어를 붙일 수 있다.
// asis (String s1, String s2) -> s1 + s2 (s1,s2) -> s1 + s2 // tobe (@Nonnull var s1, @Nullable var s2) -> s1 + s2
java.net.http.HttpClient
- HttpClient는 HTTP/1.1 과 HTTP/2를 모두 지원하고, java11 에서 http통신의 기본객체이다.
- 비동기가 기본이고 CompletableFuture 구현체이다.
- Apache HttpClient, Jetty, Spring RestTemplate 과 같은 서드파티 의존성없이 기본 제공되어 사용가능하다.
```java
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI(“https://mmm”))
.headers(“Content-Type”,”text/plain”)
.GET()
.build();
HttpClient client = HttpClient.newHttpClient();
// sync
HttpResponse
response = client.send(request,BodyHandlers.ofString()); // async ExecutorService exeService = Executors.newFixedThreadPool(2); CompletableFuture<HttpResponse > asyncResponse = client .executor(exeService) .sendAsync(request,BodyHandlers.ofString());
assertThat(response.uri()).isEqualTo(“https://mmm”)
## [Nest Based Access Control](https://www.baeldung.com/java-nest-based-access-control)
- Nested Class? = InnerClass
```java
public class Outer {
public void outerPublic() {
}
private boolean outerPrivate() {
return false;
}
class Inner {
public boolean innerPublic() {
return outerPrivate();
}
}
}
...
@Test
void isNested() {
OuterClass outerClass = new OuterClass();
assertThat(outerClass.new InnerClass().innerPublic()).isFalse();
}
- 위 예제의 Outer과 Inner은 nested 관계.
- jdk 11과 8에서 모두 돌아가기는 함.
- jdk11 이전에서는 컴파일러 단계에서 OuterClass에 package-private bridgeMethod 가 생성되어 Inner에서 해당 브릿지메서드를 호출하는 형식이다. 이 방식은 직관적이지 않고, jar크기를 키울수있다.
- jdk11 이후부터는 브릿지 메서드 없이 outerPrivate 메서드를 바로 호출가능.
Set<String> nestedMembers = Arrays.stream(MainClass.NestedClass.class.getNestMembers()) .map(Class::getName) .collect(Collectors.toSet()); assertThat(nestedMembers).contains(MainClass.class.getName(), MainClass.NestedClass.class.getName());
java 파일실행
- javac로 컴파일할 필요가 없어졌다.
# asis $javac Helloworld.java $java Helloworld # tobe $java Helloworld.java
성능향상
No-Op GC
- garbage Collect를 하지않는 GC 지원
-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC
- 일반 어플리케이션에 사용하기보다, 성능테스트나 짧게 돌아가는 자바프로그램에 적합.
JFR In OpenJDK : Java Flight Recorder
성능지표를 수집할수있는 JFR이 oracle 외에 open jdk에서도 사용가능해짐. ##
출처