はじめに
オラクル認定資格教科書 Javaプログラマ Silver SE8
第一章 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クラスはインスタンス生成時にデフォルトで16文字分のバッファを持っており、変更可能である
appendメソッド
文字列.append(hello)
文字列.append("hello")
文字列.append('a')
文字列.append("hello", 1, 3)
→位置の指定もできる
文字列に新しい文字列を追加する
insertメソッド
文字列.insert(位置, 挿入する文字列)
文字列を任意の場所に挿入する
deleteメソッド
文字列.delete(開始位置, 終了位置)
任意の範囲を削除する
deleteCharAtメソッド
文字列.deleteCharAt(何文字目か指定)
任意の一文字を削除する
reverseメソッド
文字列.reverse()
文字列を逆転させる
subSequenceメソッド
文字列.subSequence(開始位置, 終了位置)
subStringメソッドと同様、任意の範囲の文字列を抽出する
ラムダ式
関数型インターフェイスを実装したクラスのインスタンスを、ごく短いコーディング量で簡単につくる方法
→クラスの宣言とインスタンスの生成を同時に行う文法
関数型インターフェースとは
ラムダ式やメソッド参照の代入先になれるインターフェースのこと。 関数型インターフェースの条件は、大雑把に言って、定義されている抽象メソッドが1つだけあるインターフェース。 staticメソッドやデフォルトメソッドは含まれていても構わない(関数型インターフェースの条件としては無視される
構文
関数インターフェースの型 変数名 = (引数型 変数名) -> {処理};
引数が1つの時は()を省略できる
関数インターフェースの型 変数名 = 引数型 変数名 -> {処理};
処理が一つの時は{}を省略できる
関数インターフェースの型 変数名 = 引数型 変数名 -> 処理;
処理が一つしかなく、それが値を戻す場合はreturnを記述できない(中カッコ{}を付けた場合は記述できる)
関数インターフェースの型 変数名 = 引数型 変数名 -> {return 値};
関数インターフェースの型 変数名 = 引数型 変数名 -> 値;
関数インターフェースの型 変数名 = 引数型 変数名 -> return 値;
→コンパイルエラー
// 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が表示される
}
↓↓ラムダ式で書き換えると以下の一つで済む
class MainTest {
public static void main(String[] args) {
SampleInterface s = (a, b) -> a + b; // ここまでラムダ式(インタフェースの実現とインスタンスの生成が1文で完了)
System.out.println(s.sample(5, 5));
}
}
ラムダ式のスコープ
ラムダ式はそれを囲むブロックと同じスコープを持つ
ラムダ式で引数を宣言するとき、ブロック内にある変数と同じ名前を使えない。
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として返す。
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クラスでは月は0から始まるが、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");
ほかにもあるがとりあえずこの3つ・・・
LocalTimeクラス
LocalTimeクラスは時刻を扱うためのクラス
特徴として
1.不変オブジェクトである
2.24時間で時間を扱い、午前/午後を区別しない
時刻を扱う 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メソッド(日付差を求める)
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()
System.out.println(period.toMonths()); // 1年2ヶ月9日なので14ヶ月となる(1ヶ月未満は切り捨て)
// toYears, toMouths, toDays...
指定の単位だけ取り出す getXXX()
System.out.println(period.getMonths()); // P1Y2M9D(1年2ヶ月9日)の場合「2」が取り出される
// getYears, getMouths, getDays...
untilメソッド
もう一方の日付までの時間量を指定された単位で計算します。
ほぼbetweenメソッド
startDate.until(endDate, DAYS); // 日付の差を日数単位で出す
startDate.until(endDate, MONTHS); // 日付の差を月単位で出す
startDate.until(endDate); // 単位を指定しなかった場合、年月日で出る
時刻の差を扱う Durationクラス
Durationは時間ベースの時間量(3時間40分など)を表す。
betweenメソッド(時間差を求める)
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の基本①】クラスの構造
【Javaの基本②】パッケージとインポート
【継承の操作②】インターフェース
【Javaのデータ型の操作①】プリミティブ型のデータ・参照型
【演算子と判定構造の使用①】論理演算子(&&、||)、同一性(==)、同値性(equals)
【演算子と判定構造の使用②】分岐処理(if、swich)
【配列の作成と使用】
【ループ構造の使用】while文、do-while文、for文、拡張for文
【メソッドとカプセル化の操作①】メソッドの概要
【メソッドとカプセル化の操作②】オーバーロード、コンストラクタ
【継承の操作①】クラスの継承
【例外の処理】
【Java APIの主要なクラスの操作】