関数型インタフェースとラムダ式

https://www.casleyconsulting.co.jp/blog/engineer/114/

 

Java SE8で新しく追加されたラムダ式

正直よく分かってない。何がよくわかっていないか。それは使い道だ。これを使ってどんなメリットを享受できるのかが分からない。

オブジェクト指向と双璧をなす設計思想に関数型インタフェースがあるとか。
これ使えるにはオブジェクト指向の理解もいるのかと考える。勉強継続する。

【関数型インタフェース】
実装が必要な抽象メソッドを1つだけ持つインタフェース
Java SE8から、よく使うであろう関数型インタフェースは「java.util.function」として提供されている。

ラムダ式
・匿名クラスの代替
・関数型インタフェースとセットで使う。

■基本構文
関数型インタフェースの型 変数名 = (引数) -> {処理;};
・引数の宣言
・アロー演算子
・処理ブロック

ラムダ式の省略ルール
中カッコがある場合
・複数の処理が書ける
・戻り値を戻すreturn省略不可
中カッコがない場合
・1つの処理しか書けない
・戻り値を戻すreturn省略可能

ラムダ式の変数のスコープ
ラムダ式を囲むブロックと同じスコープになる。
ラムダ式から式を宣言しているメソッドのローカル変数にアクセスできる。ただし、実質的にfinalなローカル変数でなければならない。
---------------------------------------
public class Test{
public static void main(String[]args){
String str = "こんにちは";
Function f = () -> {
sysout(val);
};
×→str = "さようなら";
f.test();

---------------------------------------

正規表現(Patternクラス、Matcherクラス)

※好みとよく使いそうなもののみ記載しているので、全量じゃない点に注意。ただ、書いていないものは使い道が分からなんだ。

 

➀文字クラス

・[abc]…a、b、またはc【単純クラス】

・[^abc]…a、b、c以外の文字【否定】

・[a-zA-Z]…a-zまたはA-Z【範囲】

・[a-d[m-p]]…a-dまたはm-p = [a-dm-p]【結合】

・[a-z&&[def]]…d、e、またはf【交差】

・[a-z&&[^bc]]…a-z(bとcを除く) = [ad-z]【減算】

・[a-z&&[^m-p]]… a-z(m-pを除く) = [a-lq-z]【減算】

 

②定義済み文字クラス

・¥d…[0-9] = 数字

・¥D…[^¥d] = 数字以外

・¥s…[¥t¥nx0B¥f¥r] = 空白文字

・¥S…[^¥s] = 空白文字以外

・¥w…[a-zA-Z0-9] = 単語構成文字

・¥W…[¥w] = 単語構成文字以外

 

③境界正規表現エンジン

^…行の先頭

$…行の末尾

 

④数量子(最長一致数量子)
・X?…X、1または0回
・X*…X、0回以上
・X+…X、1回以上
・X{n}…X、n回
・X{n,}…X、n回以上
・X{n,m}…X、n回以上m回以下

 

【参考】

・【Java正規表現】文字列をチェックするパターンの書き方とサンプル

https://www.sejuku.net/blog/13215

・忘れっぽい人のための正規表現チートシート

https://qiita.com/tossh/items/635aea9a529b9deb3038

Java SE8リファレンス

-java.util.regex.Patter

https://docs.oracle.com/javase/jp/8/docs/api/java/util/regex/Pattern.html

-java.util.regex.Matcher

https://docs.oracle.com/javase/jp/8/docs/api/java/util/regex/Matcher.html

StringクラスとStringBuilderクラス

【文字列の考え方】

■位置と範囲 "abcde"

・位置の場合、aが0

・範囲の場合、aの前が0

■StringとStringBuilder

String(java.lang.String)

immutable(不変)オブジェクト

:一度セットしたフィールドの値を二度と変更できない。

StringBuilder(java.lang.StringBuilder)

mutable(可変)オブジェクト

:何度でもフィールドセットできる。

 
インスタンス生成方法】

■String(java.lang.String)

String str = new String("こんにちは");

String str = "こんにちは";

String str = String.valueOf("こんにちは");

■StringBuilder(java.lang.StringBuilder)

StringBuilder sb = new StringBuilder("abcde");

StringBuilder sb = new StringBuilder();

sb.append("abcde");


【Stringクラスのメソッド】

Java API リファレンス

https://docs.oracle.com/javase/jp/8/docs/api/java/lang/String.html

※クラス定義とエントリーポイント省略

 

(1)replaceメソッド

対象の文字列を置換後の文字列に変換する。

--------------------

String str = "abcde";String result = str.replace("abcde","12345");System.out.println(result);

--------------------

実行結果12345


(2)replaceAllメソッド

対象の正規表現文字列を置換後の文字列に変換する。

正規表現を使用しない場合

--------------------

String str = "abcde";

String result = str.replaceAll("abcde","12345");

System.out.println(result);

--------------------

実行結果12345
正規表現を使用した場合

--------------------

String str = "abcde";

String result = str.replaceAll("[a-z]","1");

System.out.println(result);

--------------------

実行結果11111


(3)charAtメソッド【位置】

引数で指定した位置の文字を戻す。
➀範囲内の場合

--------------------

String str = "abcde";

System.out.println(str.charAt(0));

--------------------

実行結果a
②範囲外の場合

--------------------

String str = "abcde";

System.out.println(str.charAt(5));

--------------------

実行結果

java.jang.StringIndexOutOfBoundsException


(4)indexOfメソッド【位置】

引数で指定した文字または文字列の開始文字位置を返す。

オーバーロードされているので、引数にStringも指定できる。
➀引数に文字(char)を指定した場合

--------------------

String str = "abcde";

System.out.println(str.indexOf(c));

--------------------

実行結果

2
②引数に文字列(String)を指定した場合

--------------------

String str = "abcde";

System.out.println(str.indexOf(bc));

--------------------

実行結果

1
③引数に存在しない文字(文字列)を指定した場合

--------------------

String str = "abcde";

System.out.println(str.indexOf(abcdef));

--------------------

実行結果

-1


(5)substringメソッド【範囲】

文字列から、指定した範囲の文字列を抽出する。

--------------------

String str = "abcde";

System.out.println(str.substring(2,4));

--------------------

実行結果

cd


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

代表的な空白とは…

スペース(\s)

タブ文字(\t)

改行(\n)(\r)

--------------------

String str = " a b cde \t";

System.out.println(trim(str));

--------------------

実行結果

a b cde


(7)lengthメソッド【範囲】

文字列の文字数を戻す。

--------------------

String str = "abcde";

System.out.println(charAt(str.length()));

--------------------

実行結果

java.lang.StringIndexOutOfBoundsException


(8)startsWithメソッド

文字列が引数で指定された文字で始まる場合、trueを返す。

--------------------

String str = "abcde";

System.out.println(str.startsWith("a"));

--------------------

実行結果true


(9)endsWithメソッド

文字列が引数で指定された文字で終わる場合、trueを返す。

--------------------

String str = "abcde";

System.out.println(str.endsWith("d"));

--------------------

実行結果

false


(10)splitメソッド

文字列を指定した正規表現に一致する位置で分割する。

--------------------

String str = "abcde";

System.out.println(str.endsWith("d"));

--------------------

実行結果

false


(11)concataメソッド

文字列と引数で渡された文字列を連結する。

--------------------

String str = "abcde";

System.out.println(str.concata("fghij"));

--------------------

実行結果

abcdefghij

 

【StringBuilderクラスのメソッド】

Java API リファレンス

https://docs.oracle.com/javase/jp/7/api/java/lang/StringBuilder.html

※クラス定義とエントリーポイント省略

(0)capacityメソッド
現在の容量を返却する。(capacity+16)
--------------------
StringBuilder sb = new StringBuilder("abcde");
System.out.println(sb.capacity());
--------------------
実行結果
21

(1)appendメソッド
文字列に新しい文字列を追加する。
--------------------
StringBuilder sb = new StringBuilder();
sb.append(true);
sb.append(1);
sb.append('a');
sb.append("bcde",1,3);
char[] array = {'a', 'b', 'c', 'd', 'e',};
sb.append(array);

System.out.println(sb.toString());
--------------------
実行結果
true1acdabcde

(2)insertメソッド【範囲】
文字列を任意の場所に挿入する。
--------------------
StringBuilder sb = new StringBuilder("abc");
//メソッドチェイン
sb.append("de").insert(2,"f");
System.out.println(sb);
--------------------
実行結果
abfcde

(3)deleteメソッド【範囲】
引数で指定した範囲の文字列を削除する。
--------------------
StringBuilder sb = new StringBuilder("abcde");
sb.delete(1,2);
System.out.println(sb);
--------------------
実行結果
acde

(4)deleteCharAtメソッド【位置】
引数で指定した位置の文字を削除する。
--------------------
StringBuilder sb = new StringBuilder("abcde");
sb.deleteCharAt(2);
System.out.println(sb);
--------------------
実行結果
abde

(5)reverseメソッド
文字列を反転する。
--------------------
StringBuilder sb = new StringBuilder("abcde");
sb.reverse();
System.out.println(sb);
--------------------
実行結果
edcba

(6)replaceメソッド【範囲】
引数(第1、第2)で指定した範囲の文字列を第3引数の文字列に置換する。
--------------------
StringBuilder sb = new StringBuilder("abcde");
sb.replace(1,3,"a");
System.out.println(sb);
--------------------
実行結果
aaade

(7)substringメソッド【範囲】
引数(第1、第2)で指定した範囲の文字列を抽出する。
--------------------
StringBuilder sb = new StringBuilder("abcde");
sb.substring(1,3);
System.out.println(sb);
--------------------
実行結果
bc

(8)subSequenceメソッド【範囲】
引数(第1、第2)で指定した範囲の文字列を抽出する。
※内部的にはsubstringメソッドを呼び出しているため、
substringメソッドと全く同じ。
--------------------
StringBuilder sb = new StringBuilder("abcde");
sb.subSequence(1,3);
System.out.println(sb);
--------------------
実行結果
bc

例外処理

・例外発生時のExceptionスローとログ出力を調べる。
・画面で多用している共通処理内での例外発生時の呼び出し元(オンライン処理とプレゼン処理)の対応は?

 

・例外
プログラム実行中に発生する「トラブル」
ex)
プログラマーの不注意で作り込むバグ
要件や仕様の間違い
実行マシンの不具合
他のソフトウェアとの連携不具合
…etc

・例外処理
万が一のトラブルに備えたプログラミング
×トラブル発生で停止する
×トラブル発生で動作しなくなる
×トラブル発生で動作するが正常処理しない

・構文
try{
例外が発生する可能性のある処理

catch(例外クラス型 変数){
例外が発生したときの処理
//このブロックの処理が終わる=トラブルは収束したとして、正常な動作に戻る。

finally{
例外発生の有無に関わらず必ず実行する処理

・例外クラス
エラー:プログラムが対処できないトラブル
例外 :プログラムが対処できるトラブル

Throwable
|
| ̄ ̄ ̄ ̄ |
Error        Exception★
                |
                RuntimeException

・検査例外と非検査例外
コンパイラが例外処理の記述チェックをするか否かで、例外は検査例外と非検査例外に分類される。

⑴検査例外:try-catch文 or throws宣言句必須
①Exceptionクラス
②Exceptionクラスのサブクラス(RuntimeExceptionクラスを除く)

⑵非検査例外:try-catch文 or throws宣言句任意
①Errorクラス
②RuntimeExceptionクラス
③RuntimeExceptionクラスのサブクラス

継承と実現

⑴継承
あるクラスの機能を拡張した新しいクラスを定義すること。

サブクラス extends スーパクラス

サブクラスのインスタンス=スーパクラスのインスタンス + 差分のインスタンス

【継承しても引き継げないもの】
・コンストラク
・private フィールドとメソッド

【何のために使うか?】
ポリモーフィズム※の実現のために使う
×差分プログラミングの実現のために使う
なぜなら、差分プログラミングでは、スーパクラスがどのサブクラスから継承されているか分からないため。

【多重継承】
・クラス 禁止
・インタフェース 許容

 

※実際に動作しているインスタンスインスタンスの元となった型とは異なる型で扱える仕組み。ただし、関係(互換性)、つまり、継承関係か実現関係があること。

 

 ⑵実現

作成中

インタフェースとクラス

クラスの抽象度ヒエラルキー
インタフェース>抽象クラス>具象クラス

⑴インタフェース
他クラスからの「扱い方」を定義したもの
(クラスから型だけを取り出したもの)

interface Sample{
static final フィールド
public 抽象メソッド

・多重実現・多重継承 可能
・インタフェースはポリモーフィズムのために存在する。
インスタンス化できない

⑵クラス
①抽象クラス
インタフェースとクラスの両方の性質を持ったクラスで、抽象メソッドが存在する。

抽象クラス{
様々なフィールド
具象メソッド{}
抽象メソッド

・抽象クラス extends 抽象クラス
・具象クラス extends 抽象クラス
インスタンス化できない(インタフェースと同じ)

②具象クラス
具象メソッドのみ存在する。(抽象メソッドがあってはいけない)

具象クラス{
様々なフィールド
具象メソッド{}

・抽象メソッドは実装を持たないため、具象クラスとなるサブクラスが抽象メソッドをオーバーライドして、実装を提供しなければならない。