Java 言語入門からマスタリーまでの章
- 学習メモ: Java の基礎 (パート 1)_ljtxy.love のブログ - CSDN ブログ
- 学習ノート: Java-Intermediate (パート 2)_ljtxy.love のブログ-CSDN ブログ
- 学習ノート: Java 上級章 (パート 3)_ljtxy.love のブログ-CSDN ブログ
- 学習ノート: Java 上級章 (1) (パート 4)_ljtxy.love のブログ-CSDN ブログ
- 学習ノート: Java 上級章 (2) (パート 5)_ljtxy.love のブログ-CSDN ブログ
- 研究メモ: Java8_ljtxy.love のブログの新機能 - CSDN ブログ
記事ディレクトリ
1。概要
メモの要約:
- 概要: JDK1.8 で登場した新機能
- 新機能:
- ラムダ式
- メソッドリファレンス
- デフォルトのメソッド
- ストリームAPI
- 日時API
- オプションクラス
- ……
1.1 意味
Java 8 (jdk 1.8 とも呼ばれる) は、Java 言語開発のメジャー バージョンです。Oracle は、関数型プログラミング、新しい JavaScript エンジン、新しい日付 API、新しい Stream API などをサポートする Java 8 を 2014 年 3 月 18 日にリリースしました。
1.2 新機能
- ラムダ式-Lambdaでは、関数をパラメータとしてメソッドに渡すことができます(関数はパラメータとしてメソッドに渡されます)。
- メソッドリファレンス-メソッドリファレンスは、既存のJavaクラスまたはオブジェクト(インスタンス)のメソッドまたはコンストラクターを直接参照するための非常に便利な構文を提供します。メソッド参照をラムダと組み合わせて使用すると、言語構造をよりコンパクトかつ簡潔にし、冗長なコードを減らすことができます。
- デフォルトメソッド-デフォルトメソッドは、インターフェイスに実装があるメソッドです。
- 新しいツール- Nashorn エンジン jjs、クラス依存関係アナライザー jdeps などの新しいコンパイル ツール。
- ストリーム API -新しく追加されたストリーム API (java.util.stream) は、Java に真の関数型プログラミング スタイルをもたらします。
- Date Time API -日付と時刻の処理を強化します。
- オプション クラス- オプション クラスは、null ポインター例外を処理するために Java 8 クラス ライブラリの一部になりました。
- Nashorn、JavaScript エンジン- Java 8 は、JVM 上で特定の JavaScript アプリケーションを実行できる新しい Nashorn JavaScript エンジンを提供します。
例証します:
- Java8 には多くの新機能が追加されています。主に上記の機能について説明します。
- その他の機能については、JDK 8 の新機能 (oracle.com)を参照してください。
2.ラムダ式
メモの要約:
概要: コードをより簡潔かつコンパクトにする
文法:
实现的这个接口中的抽象方法中的形参列表 -> 抽象方法的处理 // 例如 (parameters) -> expression 或 (parameters) ->{ statements; }
変数のスコープ:
- ラムダ式の Final キーワードによって変更されたローカル変数を変更しようとすることは許可されていません
- ラムダ式内のローカル変数と同じ名前のパラメーターまたはローカル変数を宣言することはできません。
2.1 概要
クロージャとしても知られるラムダ式は、Java 8 のリリースを推進する最も重要な新機能です。Lambda では、関数を引数としてメソッドに渡すことができます (関数は引数としてメソッドに渡されます)。ラムダ式を使用すると、コードをより簡潔でコンパクトにすることができます。
2.2 文法
JDK1.8以降に導入された構文。記号を使って記述します->
。矢印でラムダ式を左右に分けています。左側に書かれているのは、実装されているインターフェースの抽象メソッド内の仮引数リストで、何をするのかです。右側に書かれているのは抽象メソッドの処理です。
实现的这个接口中的抽象方法中的形参列表 -> 抽象方法的处理
// 例如
(parameters) -> expression
或
(parameters) ->{
statements; }
例証します:
- **オプションの型宣言:** パラメーターの型を宣言する必要はなく、コンパイラーはパラメーター値を均一に識別できます。
- **オプションのパラメータのかっこ: **1 つのパラメータにはかっこを定義する必要はありませんが、複数のパラメータにはかっこを定義する必要があります
- **オプションの中括弧:** 本文にステートメントが含まれている場合、中括弧は必要ありません
- **オプションの戻りキーワード:** 本体に式の戻り値が 1 つだけある場合、コンパイラは自動的に値を返します。中括弧は、式が値を返すことを指定する必要があります。
2.3 基本的な使用例
// 1. 不需要参数,返回值为 5
() -> 5
// 2. 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x
// 3. 接受2个参数(数字),并返回他们的差值
(x, y) -> x – y
// 4. 接收2个int型整数,返回他们的和
(int x, int y) -> x + y
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)
参考リンク:Javaのラムダ式の詳しい解説_javaラムダ式_明日、こんにちはブログ - CSDN Blog
public class Java8Tester {
public static void main(String args[]){
Java8Tester tester = new Java8Tester();
// 类型声明 -----注意,此处是重写了接口,并用Lambda表达式进行简化后的写法
MathOperation addition = (int a, int b) -> a + b;
// 不用类型声明
MathOperation subtraction = (a, b) -> a - b;
// 大括号中的返回语句
MathOperation multiplication = (int a, int b) -> {
return a * b; };
// 没有大括号及返回语句
MathOperation division = (int a, int b) -> a / b;
System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
System.out.println("10 / 5 = " + tester.operate(10, 5, division));
// 不用括号
GreetingService greetService1 = message ->
System.out.println("Hello " + message);
// 用括号
GreetingService greetService2 = (message) ->
System.out.println("Hello " + message);
greetService1.sayMessage("Runoob");
greetService2.sayMessage("Google");
}
@FunctionalInterface // 函数式接口注解(只包含一个抽象方法的接口,称为函数式接口)
interface MathOperation {
int operation(int a, int b);
}
@FunctionalInterface
interface GreetingService {
void sayMessage(String message);
}
private int operate(int a, int b, MathOperation mathOperation){
return mathOperation.operation(a, b);
}
}
知らせ:
- ラムダ式は主に、インライン実行用の関数インターフェイスを定義するために使用されます。
- ラムダ式は匿名メソッドの必要性を排除し、Java にシンプルかつ強力な関数プログラミング機能を提供します。
2.4 変数のスコープ
2.4.1 メンバー変数
意味: ラムダ式内のローカル変数を変更しようとすることは許可されていません
public class Java8Tester {
final static String salutation = "Hello! ";
// static String salutation = "Hello! "; 可以修改
// static String salutation = "Hello! "; 可以修改
public static void main(String args[]){
GreetingService greetService1 = message -> System.out.println(salutation + message);
// GreetingService greetService1 = message -> System.out.println(salutation ="Test");
greetService1.sayMessage("Runoob");
}
interface GreetingService {
void sayMessage(String message);
}
}
例証します:
- ラムダ式で外部ローカル変数にアクセスできます
- Final によって変更された外部ローカル変数は、ラムダ式では変更できません。
2.4.2 ローカル変数パラメータ
意味: Lambda 式では、ローカル変数と同じ名前のパラメーターまたはローカル変数を宣言することはできません。
String first = "";
Comparator<String> comparator = (first, second) -> Integer.compare(first.length(), second.length());
例証します:
最初に繰り返し定義されているとコンパイルエラーが発生します
3.メソッドリファレンス
メモの概要: すでに学習済みです。詳細については、Java 上級章のこの一連のメモを参照してください。
4. 機能インターフェイス
メモの要約:
概要: 関数型インターフェイスを暗黙的にラムダ式に変換して、コードを簡素化し、コードの可読性と保守性を向上させることができます。
機能インターフェイス:
消費者インターフェース (消費インターフェース)
Consumer<String> consumer = s -> System.out.println(s); consumer.accept("Hello world");
説明: 入力パラメータを受け入れますが、戻り値はありません
サプライヤーインターフェース(生産インターフェース)
Supplier<String> supplier = () -> "Hello world"; String str = supplier.get(); System.out.println(str);
説明: 入力パラメータを受け入れ、結果を返します。
関数インターフェース (関数インターフェース)
Function<String, Integer> function = s -> s.length(); int length = function.apply("Hello world"); System.out.println(length);
説明: 入力パラメータを受け入れ、結果を返します。
述語インターフェース(アサーティブインターフェース)
Predicate<String> predicate = s -> s.length() > 5; boolean result = predicate.test("Hello world"); System.out.println(result);
説明: 入力パラメータを受け入れ、ブール値を返します。
4.1 概要
4.1.1 意味
関数型インターフェイスは、抽象メソッドを 1 つだけ持つインターフェイスですが、複数の非抽象メソッドを持つことができます。関数インターフェイスは暗黙的にラムダ式に変換できます。ラムダ式とメソッド参照 (実際にはラムダ式ともみなされます)。
4.1.2 定義
インターフェイスに @Functionallinterface を置くと、インターフェイスが関数型インターフェイスの場合はコンパイルが成功し、そうでない場合はコンパイルが失敗します。
例:
@FunctionalInterface
interface GreetingService {
void sayMessage(String message);
}
// 实现
GreetingService greetService1 = message -> System.out.println("Hello " + message);
例証します:
ラムダ式を記述する方法には省略用の関数インターフェイスが必要です
4.2 一般的に使用される機能インターフェイス
4.2.1コンシューマインターフェース
4.2.1.1 概要
Consumer<T> インターフェイスはコンシューマインターフェイスとも呼ばれ、消費するデータ型はジェネリックスによって指定されます。
4.2.1.2 一般的な方法
Consumer<T>: 2 つのメソッドが含まれます。
- void accept(T t): 指定された引数に対してこの操作を実行します
- デフォルトの Consumer < T > andThen(Consumer after): 結合された Consumer を返し、この操作を順番に実行してから、after 操作を実行します。
4.2.1.3 基本的な使用例
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
// 例如
Consumer<String> consumer = s -> System.out.println(s);
consumer.accept("Hello world");
例証します:
1 つの入力パラメータを受け入れ、戻り値はありません
4.2.1.4 基礎となるソースコード
4.2.2サプライヤーインターフェース
4.2.2.1 概要
Supplier<T> インターフェイスはプロダクションインターフェイスとも呼ばれ、インターフェイスのジェネリック型の種類を指定すると、インターフェイスの get メソッドが使用するデータの種類を生成します。
4.2.2.2 一般的な方法
- T get(): 結果を取得します
4.2.2.3 基本的な使用例
@FunctionalInterface
public interface Supplier<T> {
T get();
}
// 例如
Supplier<String> supplier = () -> "Hello world";
String str = supplier.get();
System.out.println(str);
例証します:
出力パラメータを指定しますが、入力パラメータは指定しません
4.2.2.4 基礎となるソースコード
4.2.3関数インターフェース
4.2.3.1 概要
Function<T,R>: このインターフェイスは通常、パラメーターの処理と変換に使用され (処理ロジックはラムダ式によって実装されます)、新しい値を返します。
4.2.3.2 一般的な方法
- R apply(T t): この関数を指定された引数に適用します
- default< V >: Function andThen(Function after): 最初に関数を入力に適用し、次に after 関数を結果に適用する結合関数を返します。
4.2.3.3 基本的な使用例
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
// 例如
Function<String, Integer> function = s -> s.length();
int length = function.apply("Hello world");
System.out.println(length);
例証します:
入力パラメータを受け入れて結果を返す
4.2.3.4 基礎となるソースコード
4.2.4述語インターフェース
4.2.4.1 概要
Predicate<T>: このインターフェイスは通常、パラメーターが指定された条件を満たしているかどうかを判断するために使用されます。
4.2.4.2 一般的な方法
- boolean test(T t): 与えられたパラメータを判定し(判定ロジックはラムダ式で実現)、ブール値を返す
- デフォルト Predicate< T > negate(): 論理否定に対応する論理否定を返します。
- デフォルトの Predicate< T > and(): ショートサーキットと
- デフォルト Predicate< T > or(): ショートサーキットまたは
- isEqual(): 2 つのパラメータが等しいかどうかをテストします
4.2.4.3 基本的な使用例
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
// 例如
Predicate<String> predicate = s -> s.length() > 5;
boolean result = predicate.test("Hello world");
System.out.println(result);
例証します:
入力パラメータを受け入れ、ブール値を返します
4.2.4.4 基礎となる原則
5.デフォルトの方法
メモの要約:
概要: デフォルトの方法では、インターフェイスは実装メソッドを持つことができ、実装クラスがそのメソッドを強制する必要はありません。
文法:
public interface Vehicle { default void print(){ System.out.println("我是一辆车!"); } }
複数のデフォルト メソッド: 複数のインターフェイスを実装し、インターフェイスのメソッドが同じ名前を持つ場合、このメソッドをオーバーライドするか、Super キーワードを使用して指定されたインターフェイスを呼び出すことができます。
public class Car implements Vehicle, FourWheeler { public void print(){ Vehicle.super.print(); } }
静的デフォルト メソッド: 静的デフォルト メソッド。直接呼び出すことができ、このメソッドのオーバーライドを強制しません。
public interface Vehicle { // 静态方法 static void blowHorn(){ System.out.println("按喇叭!!!"); } }
5.1 概要
5.1.1 意味
Java 8 では、新しいデフォルト メソッドがインターフェイスに追加されます。簡単に言えば、デフォルトの方法では、インターフェイスは実装メソッドを持つことができ、実装クラスがそのメソッドを強制する必要はありません。デフォルトのメソッドを実装するには、メソッド名の前にデフォルトのキーワードを追加するだけです。
5.1.2 機能
デフォルトの入力方法。その目的は、インターフェースの変更と既存の実装の間の非互換性の問題を解決することです。
5.2 構文
public interface Vehicle {
default void print(){
System.out.println("我是一辆车!");
}
}
例証します:
デフォルトのキーワードをインターフェースに追加します
5.3 複数のデフォルトメソッド
クラスが複数のインターフェイスを実装し、インターフェイス内のメソッドが同じ名前を持つ場合、インターフェイス メソッドをオーバーライドするか、super キーワードを使用して特定の呼び出しを行うことができます。
// 接口
public interface Vehicle {
default void print(){
System.out.println("我是一辆车!");
}
}
public interface FourWheeler {
default void print(){
System.out.println("我是一辆四轮车!");
}
}
// 重写接口默认方法
public class Car implements Vehicle, FourWheeler {
default void print(){
System.out.println("我是一辆四轮汽车!");
}
}
// 通过super调用指定接口的默认方法
public class Car implements Vehicle, FourWheeler {
public void print(){
Vehicle.super.print();
}
}
5.4 静的なデフォルトメソッド
public interface Vehicle {
default void print(){
System.out.println("我是一辆车!");
}
// 静态方法
static void blowHorn(){
System.out.println("按喇叭!!!");
}
}
例証します:
インターフェイス内の静的メソッドを直接呼び出すことができます
例:
Vehicle.blowHorn();
6.ストリーム
メモの概要: すでに学習済みです。詳細については、Java 上級章のこの一連のメモを参照してください。
7. オプションクラス
メモの要約:
- 概要:
- 意味: Optional クラスは、null を指定できるコンテナ オブジェクトです。
- 機能: null ポインタ例外を非常にうまく解決できます。
- 共通のメンバーメソッド:
- オプションのオブジェクトを取得します。
- ofNullable : null 以外の場合は、Optional で記述された指定された値を返し、それ以外の場合は空の Optional を返します。
- of : null 以外の値を指定したオプションを返します
- 判定値が存在します:
- isPresent : メソッドは、値が存在する場合は true を返し、それ以外の場合は false を返します。
- isEmpty : メソッドは値が存在しない場合は true を返し、それ以外の場合は false を返します。
- orElse : 値が存在する場合はその値を返し、それ以外の場合はその他の値を返します。
- 値の取得:
- get : この値がこのオプションに含まれている場合は値を返し、そうでない場合は例外をスローします: NoSuchElementException
7.1 概要
7.1.1 意味
Optional クラスは、null にすることもできるコンテナ オブジェクトです。値が存在する場合、isPresent() メソッドは true を返し、get() メソッドを呼び出すとオブジェクトが返されます。オプションはコンテナです。タイプ T の値、または単なる null を保持できます。Optional には、null 値を明示的に検出する必要がないように、多くの便利なメソッドが用意されています。
7.1.2 機能
Optional クラスの導入により、null ポインター例外が非常にうまく解決されました。
7.2 共通メンバーメソッド
シリアルナンバー | 方法と説明 |
---|---|
1 | **static Optional empty()** は空の Optional インスタンスを返します。 |
2 | **booleanquals(Object obj)** は、他のオブジェクトが Optional に等しいかどうかを決定します。 |
3 | **Optional filter(Predicate<? super predicate)** 値が存在し、その値が指定された述語に一致する場合は、値を説明する Optional を返し、それ以外の場合は空の Optional を返します。 |
4 | ** Optional flatMap(Function<? super T,Optional > mapper)** 値が存在する場合は、Optional に含まれるマッピング メソッドに基づいて値を返し、それ以外の場合は空の Optional を返します。 |
5 | **T get()** この値がこの Optional に含まれている場合は値を返し、そうでない場合は例外をスローします: NoSuchElementException |
6 | **int hashCode()** は、既存の値のハッシュ コードを返します。値が存在しない場合は 0 を返します。 |
7 | **void ifPresent(Consumer<? super T> Consumer)** 値が存在する場合は、その値を使用してコンシューマを呼び出します。そうでない場合は、何も行いません。 |
8 | **boolean isPresent()**このメソッドは、値が存在する場合は true を返し、それ以外の場合は false を返します。 |
9 | **オプションのマップ(Function<? super T,? extends U> マッパー)** 値がある場合は、その値に対してマッピング関数を実行して戻り値を取得します。戻り値が null でない場合は、map メソッドの戻り値としてマップの戻り値を含む Optional を作成し、それ以外の場合は空の Optional を返します。 |
10 | **static Optional of(T value)** は、null 以外の値を指定する Optional を返します。 |
11 | **static Optional ofNullable(T value)** null 以外の場合は、Optional で記述された指定された値を返し、それ以外の場合は空の Optional を返します。 |
12 | **T orElse(T other)**値が存在する場合はその値を返し、存在しない場合は other を返します。 |
13 | **T orElseGet(Supplier<? extends T> other)** 値が存在する場合はその値を返し、そうでない場合は other をトリガーして、他の呼び出しの結果を返します。 |
14 | ** T orElseThrow(Supplier<? extends X>ExceptionSupplier)** 値が存在する場合は、含まれている値を返し、それ以外の場合は、Supplier によって継承された例外をスローします。 |
15 | **String toString()** はデバッグ用にオプションの空でない文字列を返します |
7.3 基本的な使用例
import java.util.Optional;
public class Java8Tester {
public static void main(String args[]){
Java8Tester java8Tester = new Java8Tester();
Integer value1 = null;
Integer value2 = new Integer(10);
// Optional.ofNullable - 允许传递为 null 参数
Optional<Integer> a = Optional.ofNullable(value1);
// Optional.of - 如果传递的参数是 null,抛出异常 NullPointerException
Optional<Integer> b = Optional.of(value2);
System.out.println(java8Tester.sum(a,b));
}
public Integer sum(Optional<Integer> a, Optional<Integer> b){
// Optional.isPresent - 判断值是否存在
System.out.println("第一个参数值存在: " + a.isPresent());
System.out.println("第二个参数值存在: " + b.isPresent());
// Optional.orElse - 如果值存在,返回它,否则返回默认值
Integer value1 = a.orElse(new Integer(0));
//Optional.get - 获取值,值需要存在
Integer value2 = b.get();
return value1 + value2;
}
}
8.Rhino JavaScript
注の概要: Nashorn JavaScript エンジンは Java 15 では使用できなくなりました。次を参照してください: Java 8 Nashorn JavaScript | 初心者チュートリアル (runoob.com)
9. 日時API
メモの概要: すでに学習済みです。詳細については、Java 上級章のこの一連のメモを参照してください。
10.Base64エンコーディング
メモの要約:
- 概要: Base64 は、バイナリ データを ASCII 文字にエンコードするためのエンコード方式です。
- 分類:
- 基本:
- エンコーダ
- デコーダ
- URL:
- getURLEncoder
- getURLDecoder
- マイム
- getMimeEncoder
- getMimeDecoder
10.1 概要
10.1.1 意味
Java 8 では、Base64 エンコーディングが Java クラス ライブラリの標準になりました。Base64 クラスは、Base64 エンコーディングとデコーディングをサポートするために Java8 で提供されています。
10.1.2 機能
Base64 は、バイナリ データを ASCII 文字にエンコードするために使用されるエンコード方式で、ネットワーク送信中にバイナリ データを読み取り可能な文字列に変換するためによく使用されます。
10.1.3 分類
Base64 ツール クラスは、次の 3 つの BASE64 コーデックを取得するための静的メソッドのセットを提供します。
- **基本:** 出力は文字セット A-Za-z0-9+/ にマップされ、エンコードでは行マーカーは追加されず、出力のデコードでは A-Za-z0-9+ のみがサポートされます。 /
- **URL:** 出力は文字セット A-Za-z0-9+_ にマップされ、出力は URL とファイルです
- **MIME:** 出力は MIME 対応形式にマップされます。出力は 1 行あたり 76 文字以下で、「\r」とそれに続く「\n」で区切る必要があります。エンコードされた出力の最後に行分割はありません
10.2 埋め込みクラス
シリアルナンバー | インラインクラスと説明 |
---|---|
1 | static class Base64.Decoderこのクラスは、Base64 エンコードを使用してバイト データをデコードするためのデコーダを実装します。 |
2 | static class Base64.Encoderこのクラスは、Base64 エンコーディングを使用してバイト データをエンコードするエンコーダーを実装します。 |
10.3 共通のメンバーメソッド
シリアルナンバー | メソッド名と説明 |
---|---|
1 | **static Base64.Decoder getDecoder()** は、デコードに基本的な Base64 エンコード スキームを使用するBase64.Decoder を返します。 |
2 | **static Base64.Encoder getEncoder()** は Base64.Encoder を返し、エンコードには基本的な Base64 エンコード スキームが使用されます。 |
3 | **static Base64.Decoder getMimeDecoder()** は、デコードに MIME タイプの Base64 エンコード スキームを使用する Base64.Decoder を返します。 |
4 | **static Base64.Encoder getMimeEncoder()** は Base64.Encoder を返し、エンコードには MIME タイプの Base64 エンコード スキームが使用されます。 |
5 | **static Base64.Encoder getMimeEncoder(int lineLength, byte[] lineSeparator)** は Base64.Encoder を返します。エンコードには MIME Base64 エンコード スキームが使用されます。各行の長さと行区切り文字はパラメータで指定できます。 |
6 | **static Base64.Decoder getUrlDecoder()** は、URL およびファイル名に対して安全な Base64 エンコード スキームを使用してデコードする Base64.Decoder を返します。 |
7 | **static Base64.Encoder getUrlEncoder()** は、URL およびファイル名に安全な Base64 エンコード スキームをエンコードする Base64.Encoder を返します。 |
10.4 基本的な使用例
public class Java8Tester {
public static void main(String args[]){
try {
// 基本编码
String base64encodedString = Base64.getEncoder().encodeToString("runoobjava8".getBytes("utf-8"));
System.out.println("Base64 编码字符串 (基本) :" + base64encodedString);
// 基本解码
byte[] base64decodedBytes = Base64.getDecoder().decode(base64encodedString);
// URL 和文件名安全型 编码
System.out.println("原始字符串: " + new String(base64decodedBytes, "utf-8"));
base64encodedString = Base64.getUrlEncoder().encodeToString("runoob?java8".getBytes("utf-8"));
System.out.println("Base64 编码字符串 (URL) :" + base64encodedString);
// MIME 型 编码
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 10; ++i) {
stringBuilder.append(UUID.randomUUID().toString());
}
byte[] mimeBytes = stringBuilder.toString().getBytes("utf-8");
String mimeEncodedString = Base64.getMimeEncoder().encodeToString(mimeBytes);
System.out.println("Base64 编码字符串 (MIME) :" + mimeEncodedString);
}catch(UnsupportedEncodingException e){
System.out.println("Error :" + e.getMessage());
}
}
}