【Java APIの主要なクラスの操作】

## はじめに
オラクル認定資格教科書 Javaプログラマ Silver SE８
第一章　Javaの基本　
第二章　Javaのデータ型の操作
第三章　演算子と判定構造の使用
第四章　配列の作成と使用
第五章　ループ構造の使用
第六章　メソッドとカプセル化の操作
第七章　継承の操作
第八章　例外の処理
第九章　Java APIの主要なクラスの操作←　ｲﾏｺｺ！！

## Stringクラス
Immutableなクラスであり、インスタンス内部に持っている文字列を変更することはできない。
文字列に変更を加えた場合、新しいインスタンスが生成される。

#### replaceメソッド
`文字列.replace("元の文"、 "差し替え文")`
文字列の一部を指定した文字列に差し替える

#### charAtメソッド
`文字列.charAt(何文字目か指定)`
指定した一文字を抜き出す

#### indexOfメソッド
`文字列.indexOf("文章")`
引数で指定した文字が文字列のどの位置にあるのかを返す

#### substringメソッド
`文字列.substring(開始位置, 終了位置)`
文字列から任意の文字列を抜き出す

#### trimメソッド
`文字列.trim()`
文字列の前後にある空白を除去する

#### startWithメソッド
`文字列.startWith("b")`
対象の文字列が引数で指定した文字で始まっているかを真偽判定

#### splitメソッド
`文字列.split(正規表現)`
文字列を指定した部分で分割する

#### concatメソッド
`String str = "Hello".concat("World")`
文字列に引数内の文字列を連結して、新しい文字列を戻す

#### containsメソッド
文字列が引数の文字列を含んでいるか確認する

## StringBuilderクラス
StringBuilderクラスはインスタンス生成時にデフォルトで１６文字分のバッファを持っており、変更可能である

#### appendメソッド
`文字列.append(hello)`
`文字列.append("hello")`
`文字列.append('a')`
`文字列.append("hello", 1, 3)`→位置の指定もできる
文字列に新しい文字列を追加する

#### insertメソッド
`文字列.insert(位置, 挿入する文字列)`
文字列を任意の場所に挿入する

#### deleteメソッド
`文字列.delete(開始位置, 終了位置)`
任意の範囲を削除する

#### deleteCharAtメソッド
`文字列.deleteCharAt(何文字目か指定)`
任意の一文字を削除する

#### reverseメソッド
`文字列.reverse()`
文字列を逆転させる

#### subSequenceメソッド 
`文字列.subSequence(開始位置, 終了位置)`
subStringメソッドと同様、任意の範囲の文字列を抽出する

## ラムダ式
関数型インターフェイスを実装したクラスのインスタンスを、ごく短いコーディング量で簡単につくる方法
→クラスの宣言とインスタンスの生成を同時に行う文法

関数型インターフェースとは
ラムダ式やメソッド参照の代入先になれるインターフェースのこと。 関数型インターフェースの条件は、大雑把に言って、定義されている抽象メソッドが1つだけあるインターフェース。 staticメソッドやデフォルトメソッドは含まれていても構わない（関数型インターフェースの条件としては無視される

**構文**
`関数インターフェースの型 変数名 = (引数型　変数名) -> {処理};`

引数が１つの時は（）を省略できる
`関数インターフェースの型 変数名 = 引数型　変数名 -> {処理};`

処理が一つの時は{}を省略できる
`関数インターフェースの型 変数名 = 引数型　変数名 -> 処理;`

処理が一つしかなく、それが値を戻す場合はreturnを記述できない（中カッコ{}を付けた場合は記述できる）
`関数インターフェースの型 変数名 = 引数型　変数名 -> {return 値};`
`関数インターフェースの型 変数名 = 引数型　変数名 -> 値;`
`関数インターフェースの型 変数名 = 引数型　変数名 -> return 値;`→コンパイルエラー

```java
// int型のsampleメソッドを持つSampleInterfaceというインターフェースがあるとする

class Implement implements SampleInterface {
    public int sample(int a, int b) {
        return a + b;
    }
}


class MainTest {
    public static void main(String[] args) {
        Implement impl = new Implement();
        System.out.println(impl.sample(5, 5)); // → 10が表示される
    }
```
↓↓ラムダ式で書き換えると以下の一つで済む
```java
class MainTest {
    public static void main(String[] args) {
        SampleInterface s = (a, b) -> a + b; // ここまでラムダ式(インタフェースの実現とインスタンスの生成が１文で完了)
        System.out.println(s.sample(5, 5));
    }
}
```
#### ラムダ式のスコープ
　ラムダ式はそれを囲むブロックと同じスコープを持つ

ラムダ式で引数を宣言するとき、ブロック内にある変数と同じ名前を使えない。
```java
public static void main(String[] args) {
  String s = "sampl"
  SampleInterface s = (String s) -> System.out.println(s); // 引数の宣言で使用した「s」は上の行で使用済みのためコンパイルエラー
  s.method("文字列"));
}
```
　同じスコープ内であればラムダ式からラムダ式外の変数へアクセスできる。
ただし、実質的にfinalな変数（finalでなくとも、変数に対して変更を行わないこと）のみが対象である。

#### 関数型インターフェース 「Predicate」
　Predicateはtestメソッド持つ関数型インターフェース、引数を1つ受け取り、booleanを返す。

　test(T t)には、ジェネリクスに指定する型を引数として与える。
　ラムダ式の処理部分にはbooleanを返すための評価式を記述する。
　以下では、正数をtrueとして返す。

```java
Predicate<Integer> number = num -> num > 0;
System.out.println(number.test(1));	// true
System.out.println(number.test(0));	// false
```
## 日付と時刻に関するAPI
### LocalDateクラス
　日付を扱うクラスには、DateクラスやCalenderクラスなどがあるが、これらを改良したのがLocalDateクラス。
特徴として
1.Dateクラスは可変オブジェクトだが、LocalDateクラスは不変オブジェクトである
2.Calenderクラスでは月は０から始まるが、LocalDateでは1から始まる
3.日付を操作する便利メソッドが追加された
#### 日付を扱う　LocalDateクラスのメソッド
##### ofメソッド
　日付を指定してインスタンスを生成
`LocalDate date = LocalDate.of(2022, 1, 1);` // 2022-01-01 となる
##### nowメソッド
　現在の日付でインスタンスを生成
`LocalDate date = LocalDate.now();`
##### parseメソッド
　文字列の日付をLocalDateクラスに変換する
`LocalDate date = LocalDate.parse("2022-04-01");`

ほかにもあるがとりあえずこの３つ・・・
### LocalTimeクラス
 LocalTimeクラスは時刻を扱うためのクラス
特徴として
1.不変オブジェクトである
2.２４時間で時間を扱い、午前/午後を区別しない
#### 時刻を扱う　LocalTimeクラスのメソッド
##### ofメソッド
　時刻を指定してインスタンスを生成
`LocalTime time = LocalTime.of(14, 25, 3);` // 14:25:03.00 となる
 時：分：秒：ナノ秒 までフィールドがあり、秒以下は省略ができ、その場合00となる
##### nowメソッド
　現在の時刻でインスタンスを生成
`LocalTime time = LocalTime.now();`
##### parseメソッド
　文字列の時刻をLocalTimeクラスに変換する
`LocalTime time = LocalTime.parse("14:25:3");`
##### plusHoursメソッド
　指定された時間数を加算しする（LocalTimeオブジェクトは不変のため、加算した結果は新しいオブジェクトとなる）
`LocalTime time = LocalTime.of(12, 1, 1);`
`time.plusHours(5);`
→17:01:01.00となる
分、秒、ナノ秒バージョンもある
`plusMinutes(long minutesToAdd)`
`plusSeconds(long secondstoAdd)`
`plusNanos(long nanosToAdd)` // 0から999,999,999

#### LocalDateTimeクラス
LocalDateクラスとLocalTimeクラスを合わせたようなクラス
日付と時刻の両方を扱える
`2021-05-30T15:47:13.395703`
now()、of(年, 月, 日,  時, 分, 秒, ナノ秒)
plusXXX()、minusXXX()
getXXX()
getYear()、getMonth()、getDayOfMonth()、getDayOfWeek()、getDayOfYear()
などのメソッドもLocalDateTimeクラスに適用できる。

分かりやすい日付へ変更する場合にはDateTimeFormatterクラスを使用する

### 日付の差を扱う　Periodクラス
Periodは日付ベースの時間量(3年4ヶ月など)を表す。
#### betweenメソッド（日付差を求める）
```java
LocalDate from = LocalDate.of(2014, 1, 1);
LocalDate to = LocalDate.of(2015, 3, 10);
Period period = Period.between(from, to);
System.out.println(period); // P1Y2M9D -> 1年2ヶ月9日の意味
```
#### 全期間を指定の単位へ変換  toXXX()
```java
System.out.println(period.toMonths()); // 1年2ヶ月9日なので14ヶ月となる（1ヶ月未満は切り捨て）
// toYears, toMouths, toDays...
```
#### 指定の単位だけ取り出す　getXXX()
```java
System.out.println(period.getMonths()); // P1Y2M9D（1年2ヶ月9日）の場合「2」が取り出される
// getYears, getMouths, getDays...
```
#### untilメソッド
もう一方の日付までの時間量を指定された単位で計算します。
ほぼbetweenメソッド
```java
startDate.until(endDate, DAYS); //　日付の差を日数単位で出す
startDate.until(endDate, MONTHS); //　日付の差を月単位で出す
startDate.until(endDate); // 単位を指定しなかった場合、年月日で出る
```


### 時刻の差を扱う　Durationクラス
Durationは時間ベースの時間量(3時間40分など)を表す。
#### betweenメソッド（時間差を求める）
```java
LocalDateTime from = LocalDateTime.of(2015, 12, 15,  0,  0,  0);
LocalDateTime to   = LocalDateTime.of(2015, 12, 16, 12, 30, 59);
Duration duration = Duration.between(from, to);
System.out.println(duration); //PT36H30M59S -> 36時間30分59秒という意味
```
他のメソッドはPeriodクラスと似たようなもの

## リンク集
[【Javaの基本①】クラスの構造](https://qiita.com/vitamin_b12/items/3f920cd223fd3cc1ceae)
[【Javaの基本②】パッケージとインポート](https://qiita.com/vitamin_b12/items/be766c8c3ef2366d9fea)
[【継承の操作②】インターフェース](https://qiita.com/vitamin_b12/items/cdc76298d7f6a494dff2)
[【Javaのデータ型の操作①】プリミティブ型のデータ・参照型](https://qiita.com/vitamin_b12/items/f922ab56e4d8b6580f49)
[【演算子と判定構造の使用①】論理演算子(&&、||)、同一性（==）、同値性(equals)](https://qiita.com/vitamin_b12/items/9feb89e8fb1bc67a8d6d)
[【演算子と判定構造の使用②】分岐処理(if、swich)](https://qiita.com/vitamin_b12/items/523467908e683474eac7)
[【配列の作成と使用】](https://qiita.com/vitamin_b12/items/2fc45588640c479e1f4d)
[【ループ構造の使用】while文、do-while文、for文、拡張for文](https://qiita.com/vitamin_b12/items/23d853dda9baf727e4ac)
[【メソッドとカプセル化の操作①】メソッドの概要](https://qiita.com/vitamin_b12/items/215ad731221c2691c441)
[【メソッドとカプセル化の操作②】オーバーロード、コンストラクタ](https://qiita.com/vitamin_b12/items/e4fd3d51a35bb6a5566c)
[【継承の操作①】クラスの継承](https://qiita.com/vitamin_b12/items/19f8ad6f9801ac8f6a8f)
[【例外の処理】](https://qiita.com/vitamin_b12/items/f7ebf2c1106a7dcbdb41)
[【Java APIの主要なクラスの操作】](https://qiita.com/vitamin_b12/items/dcd3edfe2273e5a09231)