Be-Developer

JAVA 11 release

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에서도 사용가능해짐. ##


출처