小さな結び目
多くの初心者のJavaジュニアパートナーは、多くの場合、ご相談します:
- 優れているJDKのバージョン、インストールの最後には?
- また、十分なエンドでのJava 8は、使用するには?
- Javaの11正確に何の改善?
- ジャワの優れた新バージョンでは、より多くのではないですか?
- ......
だから、実際には、今、公式サイトでは、Java 13のバージョンを持って、ダウンロードを提供します。
しかし、現在の市場の主流での安定したバージョンもちろん、あなたがに属しする必要がJavaの8とJavaの11、そして今ではほとんどの会社の生産環境やのJava 8
大多数。自習の観点から、私はこれらの2つのバージョンがOKだと思うのであれば、他のいくつかの中間的なJava 9
、Java 10
これらの非安定版では考えられなかったでしょう。
Java8対Java11
ジャワ8に対してジャワ11は、言語使用のいくつかの局面である初心者のユーザーのためのより(等GCの低コストと遅延、TLS1.3祝福、など)は、多くの内部のアップグレードに加えて、実際に進化の一部であります進化。
最近、私は自分の個人的な小さなプロジェクトに少しアップグレードを使用しようとJava 11
大体私の個人的な経験に、実際のコードの視点から書かれたこの記事を(私たちは移動に大胆されていないプロジェクト会社、尋ねるのを恐れて、彼らの個人的な項目を移動しなければなりませんでした)使用Java 11
比較的後にJava 8
、より深遠な進化の一部で感じて、公式ドキュメントは非常に明確であると言います。https://docs.oracle.com/en/java/javase/11/
私はこの実験インストールされているJava 11
バージョンがあります11.0.6
:
事実を証明して新機能のいくつかではなく、テストするには、以下の
Java 11
実際に導入、たくさんだけJava 9
とJava 10
、それだけには導入されているJava 11
落ち着く前の安定版を。
変数の型推論
Javaの新しいバージョンは、新しいタイプのキーワードを導入しvar
、利用var
することができますコンパイラに応じて、書き込み、特定の種類の必要性を定義するための変数=
に自動的に右の変数実際の割り当ての種類を推測します:
1、一般的なローカル変数
var name = "codesheep"; // 自动推断name为String类型
System.out.println(name);
どうでしょうか?弱い型付けされた言語はJavaScriptの同様の使用は、この錯覚はありますか?
図2に示すように、ループで使用するための
var upList1 = List.of( "刘能", "赵四", "谢广坤" );
var upList2 = List.of( "永强", "玉田", "刘英" );
var upList3 = List.of( "谢飞机", "兰妮", "兰娜" );
var upListAll = List.of( upList1, upList2, upList3 );
for( var i : upListAll ) { // 用var接受局部变量的确非常简洁!
for( var j : i ) {
System.out.println(j);
}
}
この場所はで見ることができますvar
定義されたローカル変数の利点、およびコレクション要素のタイプは、より複雑で、この例であれば、に似ているList<List<String>>
ネストのこのタイプは、var
定義が非常に明確かつ簡潔です!
3は、当然のことながら、いくつかのケースでは使用できません。
var
変数割り当てと異なるタイプの再割り当てのタイプは、例えば、十分ではない一度。
var name = "codesheep";
name = 666; // 此时编译会提示不兼容的类型
定義var
初期化されていない変数のタイプは、たとえば、十分ではありません。
var foo; // 此时编译会提示无法推断类型
foo = "Foo";
また、タイプなど成员变量类型
、方法入参类型
、返回值类型
などを用いることができないvar
、例えば:
public class Test {
private var name; // 会提示不允许使用var
public void setName( var name ) { // 会提示不允许使用var
this.name = name;
}
public var getName() { // 会提示不允许使用var
return name;
}
}
HTTPクライアントの公式祝福
はい!
今、JDK
公式が点灯HTTP Client
し、配置されてjava.net.http
、パッケージの下で同期、非同期送信をサポートしHTTP
、我々はクライアントなどからのHTTPリクエストを使用する前に、要求をするように:OKHttp
、HttpClient
今ステップダウンすることができます!
同期要求を送信します。
var request = HttpRequest.newBuilder()
.uri( URI.create("https://www.codesheep.cn") )
.GET()
.build();
// 同步请求方式,拿到结果前会阻塞当前线程
var httpResponse = HttpClient.newHttpClient()
.send( request, HttpResponse.BodyHandlers.ofString());
System.out.println( httpResponse.body() ); // 打印获取到的网页内容
非同期要求が送信されます。
CompletableFuture<String> future = HttpClient.newHttpClient().
sendAsync( request, HttpResponse.BodyHandlers.ofString() )
.thenApply( HttpResponse::body );
System.out.println("我先继续干点别的事情...");
System.out.println( future.get() ); // 打印获取到的网页内容
もちろん、あなたも、このような運ぶよう、リクエストヘッダをカスタマイズすることができますJWT Token
よう要求情報に権限を:
var requestWithAuth = HttpRequest.newBuilder()
.uri( URI.create("http://www.xxxxxx.com/sth") )
.header("Authorization", "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxNTIwNTE2MTE5NiIsImNyZWF0ZWQiOjE1ODMzMTA2ODk0MzYsImV4cCI6MTU4MzM5NzA4OSwidXNlcmlkIjoxMDAwNH0.OE9R5PxxsvtVJZn8ne-ksTb2aXXi7ipzuW9kbCiQ0uNoW0fJJr_wckLFmgDzxmBs3IdzIhWDAtaSIvmTshK_RQ")
.GET()
.build();
var response = HttpClient.newHttpClient()
.send( requestWithAuth, HttpResponse.BodyHandlers.ofString() );
System.out.println( response.body() ); // 打印获取到的接口返回内容
文字列処理の強化
新しい文字列String
そのような増加のようなタイプ:isBlank()
、strip()
、repeat()
およびのような文字列処理方法を容易にします
String myName = " codesheep ";
System.out.println( " ".isBlank() ); // 打印:true
System.out.println( " ".isEmpty() ); // 打印:false
System.out.println( myName.strip() ); // 打印codesheep,前后空格均移除
System.out.println( myName.stripLeading() ); // 打印codesheep ,仅头部空格移除
System.out.println( myName.stripTrailing() ); // 打印 codesheep,仅尾部空格移除
System.out.println( myName.repeat(2) ); // 打印 codesheep codesheep
強化されたコレクション
主な増加するof()
とcopyOf()
、より便利にするためのメソッドを作成すると、コピーコレクション型を
var upList = List.of( "刘能", "赵四", "谢广坤" );
var upListCopy = List.copyOf( upList );
System.out.println(upList); // 打印 [刘能, 赵四, 谢广坤]
System.out.println(upListCopy); // 打印 [刘能, 赵四, 谢广坤]
var upSet = Set.of("刘能","赵四");
var upSetCopy = Set.copyOf( upSet );
System.out.println(upSet); // 打印 [赵四, 刘能]
System.out.println(upSetCopy); // 打印 [赵四, 刘能]
var upMap = Map.of("刘能","58岁","赵四","59岁");
var upMapCopy = Map.copyOf( upMap );
System.out.println(upMap); // 打印 {刘能=58岁, 赵四=59岁}
System.out.println(upMapCopy); // 打印 {刘能=58岁, 赵四=59岁}
関数型プログラミングの強化
一番印象に残っすることでStream
、このような増加に伴い、ストリームtakeWhile()
とdropWhile()
カットオフ決済方法:
var upList = List.of( "刘能", "赵四", "谢广坤" );
// 从集合中依次删除满足条件的元素,直到不满足条件为止
var upListSub1 = upList.stream()
.dropWhile( item -> item.equals("刘能") )
.collect( Collectors.toList() );
System.out.println(upListSub1); // 打印 [赵四, 谢广坤]
// 从集合中依次获取满足条件的元素,知道不满足条件为止
var upListSub2 = upList.stream()
.takeWhile( item -> item.equals("刘能") )
.collect( Collectors.toList() );
System.out.println( upListSub2 ); // 打印 [刘能]
強化されたファイルの読み取りと書き込み
1、ファイルのクラスの拡張
私たちは、ファイルの内容を読み取るために前にあなたの心と心を指示することができますString
し、String
最終的にはサポートされているファイルに書き戻し機能により、Files
クラスの静的メソッドwriteString()
とreadString()
完全な:
Path path = Paths.get("/Users/CodeSheep/test.txt");
String content = Files.readString(path, StandardCharsets.UTF_8);
System.out.println(content);
Files.writeString( path, "王老七", StandardCharsets.UTF_8 );
2、InputStreamが強化します
InputStream
増加transferTo()
方法、データを直接に投げ込まOutputStream
GO:
InputStream inputStream = new FileInputStream( "/Users/CodeSheep/test.txt" );
OutputStream outputStream = new FileOutputStream( "/Users/CodeSheep/test2.txt" );
inputStream.transferTo( outputStream );
直接実行のサポートのソース・ファイル(666!)
例えば、私はシンプル書いたHello World
プログラムを:
public class Hello {
public static void main( String[] args ) {
System.out.println("hello world");
}
}
そして、として保存しhello.java
、ファイルで直接この時java
、直前の解消Javaソース・ファイルを実行するコマンドjavac
のソースファイルをコンパイルするためのプロセスを:
java hello.java
どうでしょうか?ソースファイルと実行のpythonビットは好きではないですか?ビット大きな情報量は、我々は自分自身の脳にそれを作ることができます
概要
Javaの11は、改善するためにたくさん持っているが、その後、再び、初心者のJava 8のために、意図的に新規性の必要は、安定性が最も重要ではありません!