Java 1.8과 Java 17 사이에 도입된 프로그래밍 기능 빠른 보기


Java 코드를 현대 표준의 특성에 맞게 만들기
Photo by Reka Illyes on Unsplash
자바는 1.8 버전에서 17 버전으로 급성장해 올해 18 버전을 발표할 계획이다.본 논문에서는 1.8판에서 17판까지 발표된 기능을 소개하고자 합니다.
이것은 매우 긴 목록이 될 것이니, 우리는 너무 많은 시간을 들여 무대를 세우지 말자.
다음 목록은 모든 버전에 도입된 모든 기능과 변경 사항을 포함하지 않고 전형적인 프로그래밍 사례에서 가장 도움이 되는 기능과 변경으로 프로그래밍을 더욱 재미있고 간단하게 할 수 있음을 주의하십시오.

자바
람다:
Lambda 표현식을 사용하면 함수를 메소드 매개변수로 사용할 수 있습니다.간단한 인터페이스를 만들기 위해 익명 클래스를 만들어야 했던 자바 8 이전 코드를 보여 줍니다.
Thread t = new Thread( new Runnable() {
 public  void run() {
  System.out.println("Start thread");
 }
});
lambda 표현식을 사용하면 우리는 한 줄에서 클래스의 실례를 나타낼 수 있다
Thread t1 = new Thread(() -> {
 System.out.println("Start 1st thread");
});
기능 인터페이스:
함수 인터페이스는 추상적인 방법만 있는 인터페이스다.이 인터페이스에는 기본 방법과 정적 방법이 있지만 추상적인 방법만 있을 수 있다.
우리는 이미 aprevious article에서 이러한 특성을 상세하게 소개했으니, 이 글을 참고하여 예시를 얻으십시오.
시냇물
흐름은 자바의 인터페이스입니다.util.집합 실행 순서와 병렬 조작 방법을 제공하는 패키지
Collection 인터페이스의 stream () 방법은 주어진 집합의stream 형식의 원소 흐름을 되돌려줍니다.
흐르는 인터페이스는 흐르는 원소의 집합 결과를 필터하거나 비추거나 찾는 데 필요한 많은 작업을 지원합니다.
다음 예시에서, 우리는 목록에stream () 방법을 호출한 다음, 술어 (함수 인터페이스) 를 브리 값을 되돌려주는anyMatch () 방법에 전달합니다.
List<String> colors = new ArrayList<>(Arrays._asList_("Green","Yellow","Red"));

boolean isTrue = colors.stream().anyMatch(x -> x.equals("Red"));

System.out.println(isTrue);
선택 사항
컨테이너 객체를 작성할 수 있습니다. 이 객체에는 비어 있지 않은 값이나 비어 있지 않은 값이 포함될 수 있습니다.Optional을 사용하면 값이 비null (present) 인지 확인할 수 있으며, isPresent () 를 사용하여 그것을 검증할 수 있습니다.
다음 예시 코드에서, 우리는 흐름 인터페이스의findAny () 방법을 사용하여 선택할 수 있는 대상을 되돌려줍니다.선택할 수 있는 실례의 값에 따라 우리는 상응하는 논리를 집행할 수 있다.
8 이전 Java 버전에서 이와 유사한 작업을 수행하려면 문자열에 대해 명시적 빈 확인을 수행해야 합니다.
List<String> colors = new ArrayList<>(Arrays._asList_("Green","Yellow","Red"));

Optional<String> color = colors.stream().filter(x -> x.equals("Black")).findAny();

System.out.println(color.isPresent()? color.get() : "Not Found");
자바의 변화.util.및 패키지 발송:
자바8에는 인터페이스 CompletionStage와 클래스 Completable Future, CompletionException이 도입됐다.
Completable Future는 Java8 이전에 존재했던 Future 객체보다 훨씬 유연하고 기능이 향상된 비동기식 작업을 수행하는 데 도움이 됩니다.
우리는 앞의 글에서 이미 하도급과 미래를 소개했기 때문에 본고에서 우리는 예시 코드를 분석하지 않을 것이다.
메소드 참조(:)
lambda 표현식 대신 이중 사칭을 사용하여 기존 방법을 호출할 수 있습니다.
방법 인용은 정적 방법과 실례 방법을 인용하는 데 사용할 수 있다.우리는 하나의 예를 보았는데, 그 중에서 우리는 정적 방법을 언급했다.
우선, lambda 표현식의 실현 방법을 사용하여 호출합니다.
public class Main {

public static void main(String[] args) {
 List<Integer> locList = **new** ArrayList<>(Arrays._asList_(1,2,5,6));
 boolean isFound = locList.stream().anyMatch(l -> _isEqual_(l));
 System.out.println(isFound);
}

public static <T> boolean isEqual(T a) {
Predicate<T> isEqual = (x) -> x.equals(5);
return isEqual.test(a);
}
}
isEqual () 은 Main 클래스의 정적 방법입니다. 따라서 우리는 lambda 표현식을 사용하여 이 방법을 호출할 필요가 없습니다. 방법 인용만 사용하면 작업을 완성할 수 있습니다.
public class Main {

public  static  void main(String[] args) {
 List<Integer> locList = new ArrayList<>(Arrays._asList_(1,2,5,6));
 boolean isFound = locList.stream().anyMatch(Main::_isEqual_);
 System.out.println(isFound);
}

public static <T> boolean isEqual(T a) {
 Predicate<T> isEqual = (x) -> x.equals(5);
 return isEqual.test(a);
}
}

Java 9
시냇물남에게 말할 수 없었어
Java8 이후 stream을 사용하여 요소 흐름을 만들 수 있습니다.Java 9에서는 스트림을 사용할 수 있습니다.단일 요소에 흐름을 만들거나 빈 흐름을 되돌려줍니다.
List<Location> locList = **new** ArrayList<>(Arrays._asList_(loc, loc1, loc2));
Stream._ofNullable_(locList);
인터페이스 중의 사유 방법
Java8은 인터페이스에 기본 메서드 개념을 도입했습니다.같은 논리를 공유하고 싶은 기본 방법이 여러 개 있다면, 사적인 방법으로 공공 논리를 실현할 수 있다.
Java 모듈
자바 모듈은 자신의 글을 한 편 쓸 만하지만, 그것이 무엇인지 빠르게 봅시다.Java 모듈은 패키지와 관련 리소스를 결합할 수 있는 기술입니다.모듈에는 모듈 이름, 의존 모듈, 다른 모듈에 사용할 패키지 등을 지정하는 모듈 설명자가 포함되어 있습니다.
최종 목표 중 하나는 실행할 때 응용 프로그램의 크기를 줄이는 것이다.GUI를 사용하지 않는 경우에는 애플리케이션에 이 모듈을 추가할 필요가 없습니다.

자바
국부 변수 유형 추정
자바 10부터 비어 있지 않은 부분 변수를 초기화하여 형식 var에 할당할 수 있습니다. 변수의 종류는 상하문에 의해 결정됩니다.
예를 들면 다음과 같다.
public class Sample {

public  static  void main(String[] args) {

var x = 10;
var y = 11;
System.out.println(x + y);

var obj = new TryVar();
System.out.println(obj.getName());

var c; //Illegal, Compiler will throw an error -> "Cannot use 'var' on variable without initializer"
}
}

class TryVar {
 String name;

 public String getName() {
  return "my name";
 }
}

자바
옵션 중의 새로운 방법
Java8의 특성에서 우리는 Optional을 사용하여 Optional을 사용하는 현식 빈 검사를 교체하는 방법을 배웠다.isPresent () 방법입니다.
Java11 이후 옵션으로 사용할 수 있습니다.isEmpty () 방법, 이 방법은 null 또는 비null 값을 기반으로 하는 부울 값을 되돌려줍니다.

자바
수장가.서브()
teeing()은 두 개의 다운스트림 컬렉터로 구성된 컬렉터를 반환합니다.
예를 하나 봅시다.이 예에서, 우리는 두 개의 변수 x와 y가 있는 Location이라는 클래스를 사용할 것입니다.teeing 예에서, 우리는 x의 수용 가능한 값과 y의 수용 가능한 값을 가진 기록 수를 가져올 것입니다. (논리는 아무런 의미가 없지만,teeing이 어떻게 작동하는지만 주목합니다.)😝 )
//Create three instances of Location
Location loc = new Location(2.2, 3.6);
Location loc1 = new Location(2.4, 3.3);
Location loc2 = new Location(2.3, 3.2);

// Add the reference variables to an ArrayList
List<Location> locList = **new** ArrayList<>(Arrays._asList_(loc, loc1, loc2));

//Count records that has correct x, Count the records that has correct y and create a new Location object  
var result = locList.stream().collect(Collectors._teeing_(Collectors._filtering_(Location :: isXFound, Collectors._counting_()),Collectors._filtering_(Location :: isYFound, Collectors._counting_()), Location :: new ));

//Print the Result
System.out.println("Records with correct X coordinate " + result.getX() + " :: Records with correct Y coordinate " + result.getY());
교실 위치는 아래 그림과 같습니다.



자바


텍스트 블록


텍스트 블록은 여러 줄 문자열을 표시하는 데 필요한 자바 문법을 최소화합니다


이것은 전통적으로 더블 인덱스에 추가된 모든 문자열을 대체할 수 있습니다


텍스트 블록을 인쇄하기 전에 여러 줄 문자열을 인쇄해야 한다면, 구분자, 연결 등을 사용해야 합니다


예를 들어 다음 코드는 한 줄에 완전한 문자열을 보여 줍니다



System.out.print("Hey There "

+ "What's up?? "

+ "How was your vacation?? "

+ ";)");

출력



Hey There What's up?? How was your vacation?? ;)

다음 줄에서 인쇄하려면 위의 코드를 아래에 있는 코드로 수정해야 합니다.



System.out.print("Hey There \n"

+ "What's up?? \n"

+ "How was your vacation?? \n"

+ ";)");

텍스트 블록을 사용하면 상술한 코드를 다음에 제시한 코드로 다시 쓸 수 있습니다.



System.out.print("""

Hey There

What's up??

How was your vacation??

;)

""");

텍스트 블록도 표준 문자열을 대체할 수 있습니다


예를 들어 아래에 보이는 두 문자열은 같은 의미를 가지고 있습니다



_//Text Block  
printMsg_ ("""
Print This!! """);

// String in Double Quotes
_printMsg_("Print this!");



자바


레코드


Records는 제한된 클래스로 POJO에게 적합합니다.표준 데이터 캐리어 클래스에는 몇 개의 개인 필드와 구조 함수와 getter/setter


간단한 데이터 캐리어 클래스의 예를 살펴보겠습니다. 두 명의 구성원이 있습니다.



public  class Location {
double x;
double y;

public Location(double x, double y) {
this.x = x;
this.y = y;
}

public double getX() {
 return x;
}

public double getY() {
 return y;
}
}

우리는 아래에서 지정한 코드를 사용하여 위의 클래스를 기록으로 다시 쓸 수 있습니다



record NewLocation( **double** x, **double** y) {}

기록은 실행할 때 Getter와 구조 함수를 가져옵니다.equals (),hashcode (),toString () 방법도 가져옵니다




자바


밀봉류/인터페이스


sealed는 클래스와 인터페이스에 추가할 수 있는 수식자입니다.밀봉류는 하위 클래스를 확장할 수 있음을 결정하고 다른 클래스가 이렇게 하는 것을 막을 수 있습니다


클래스/인터페이스를 sealed로 설명하려면 "sealed"수식자를 추가한 다음 extends나implements (적용될 경우) 를 추가한 다음 "allows"자구를 추가해야 합니다.라이센스 뒤에는 확장할 수 있는 하위 클래스의 이름이 있습니다


기타 조건은 확장 밀봉류의 하위 클래스는 1이 될 수 있습니다.파이널 — 이것은 그것의 추가 확장을 막았다


  1. 밀봉 — 이것은 밀봉 하위 클래스가 자신이 허용하는 하위 클래스를 정의할 수 있도록 허용합니다.
  2. 비밀봉 — 우리 임의의 종류로 그것을 확장합시다.

예를 들어 Location이 밀봉류라면



public  sealed  class Location permits SubLocation

하위 위치 클래스는



public  final  class SubLocation extends Location{}

또는



public  sealed  class SubLocation extends Location permits AnotherClass{}

또는



public non-sealed class SubLocation extends Location{}



자바


개울.toList()


Java16에서 우리는 수집기를 사용하지 않고 흐르는 결과를 목록에 직접 수집할 수 있습니다.토리스()



List<Integer> collectedList = locList.stream().filter( l -> l >=2).collect(Collectors._toList_());

위의 코드는 아래에서 제시한 코드와 같은 결과를 생성합니다



List<Integer> collectedListNew = locList.stream().filter( l -> l >=2).toList();



자바


스위치 모드 일치


우리는 현재 스위치 사례에서 상수치만 사용하는 것이 아니라 패턴을 사례 라벨로 사용할 수 있습니다



좋은 웹페이지 즐겨찾기