[作成中]Javaでのコーディングについての備忘録

##文字列の比較について
**Javaで文字列と文字列が一致しているか否かをチェックする場合、==演算子を使うのは厳禁！
equalsメソッドを使うこと！**

####equalsメソッドの注意点
・hoge.equals(“Hello”)においてhogeがnullの場合には例外が発生する
・***例外は“Hello”.equals(hoge)のように値を先に持ってくる、またはhoge != nullと判定することで防止できる***

##コメント
####書き方

#####1行の場合

```
//コメント
```

#####複数行の場合
```
/*
*　コメント
*/
```

###Javadocについて
####書き方
```
/**
 * Description（概要説明 ＋詳細説明）
 *
 * block tags...（ブロックタグ）
 */
```

###タグ	説明

@param	パラメータ（引数）についての説明。
@return	戻り値についての説明。
@author	プログラムの作成者についての説明。
@throw	投げられる例外についての説明。

###参考文献
[コメントの種類について](https://qiita.com/mtanabe/items/2e52e6e162d28df8437f)
[Javadocの基礎知識について](https://qiita.com/sudahiroshi/items/f12837648304bbf00a24)
[Javadoc ドキュメンテーションコメントの書き方](https://qiita.com/maku77/items/6410c67ce95e08d8d1bd)

##Map

###Mapとは
値ひとつひとつに「キー」が存在しており、「キー」と「値」がペアになっている。

###使い方
HashMapで初期化する必要がある。


MapのオブジェクトをHashMapクラスを使って宣言するには、以下のように記述します。

```java:Java
Map<キーの型名, 値の型名> オブジェクト名 = new HashMap<>();
```
####putで要素を追加
以下のように記述します。

```java:Java
Map型オブジェクト名.put(キー, 値);
```

####getで要素を取得

```java:Java
Map型オブジェクト名.get(キー);
```

####Mapの要素をループで処理する方法
#####for、foreachでループ処理
Mapに登録されているデータを一括で扱う際にはループで処理するのが一般的である。

Javaにはforeachという命令はありませんが、他言語で言うところのforeachと同じ処理方法が備わっています。

それを拡張for文といいます。

以下のように記述します。

```java:Java
for(型 変数名 : List名){
    System.out.println(変数名);
}
```

#####iteratorでループ処理

Iteratorという仕組みを使ってもループ処理を書くことができます。

以下のように記述します。

```java:Java
for(Iterator<Map.Entry<キーの型名, 値の型名>> iterator = map.entrySet().iterator() ; iterator.hasNext() ;){
    Map.Entry<キーの型名, 値の型名> entry = iterator.next();
    System.out.println(entry.getKey() + " : " + entry.getValue());
}
```
####Mapのkeyの値の取得、検索
#####keySetでkeyを取得

配列やListと違いMapには「キー」という仕組みが存在しています。

Mapの「キー」の名前だけ取得するには、keySetメソッドを使用します。

以下のように記述します。

```java:Java
Map型オブジェクト名.keySet()
```
#####containsKeyでkeyを検索
Mapの中に特定の「キー」が含まれているかどうかは、containsKeyメソッドを使って判断します。

以下のように記述します。

```java:Java
Map型オブジェクト名.containsKey(検索するキー)
```

##三項条件演算子

###使い方
```
条件式 ? 式1 : 式2
```
条件式を評価し、true(真)だった場合には式 1 を、false(偽)だった場合には式 2 を返します。
なお、条件演算子の記述で気を付けなくてはならないのは、式 1 と式 2 のデータ型を同じにすることです。
条件式の結果として何かの数値なり文字なりが戻されるので、条件式の TRUE(真)と FALSE(偽)で戻るデータ型が異なると都合が悪いからです。

具体的なプログラムは、以下のようになります。

####実装例
```java:ConditionalTest.java
/* ConditionalTest */
public class ConditionalTest {
    public static void main(String[] args) {
        int i = 2;
        int j = 3;
        int k = (i > j) ? 4 : 0;

        System.out.println("k = " + k);

        System.out.println("i = " + i);
        System.out.println((i >= j) ? "iは3以上" : "iは3以下");
    }
}
```

####コンパイルと実行結果

```java
C:\java>java ConditionalTest
k = 0
i = 2
iは3以下
```

##ゼロ埋めする方法
format関数を用います。
参考：http://write-remember.com/program/java/format/
###記述方法
|用途　|	記述例　　　　　　|　　　　　　　　	備考|
|:-----------------|------------------:|:------------------:|
|文字列の先頭を空白埋めする	| String.format("%6s", "abc")	| 指定文字列を最大6桁まで文字列の左側に空文字を追加します。|
| 文字列の後ろへ空白埋めする	| String.format("%-6s", "abc")	| 指定文字列を最大6桁まで文字列の右側に空文字を追加します。|
|数字の先頭を０埋めする |	String.format("%06d", 123) | 指定数字を最大6桁まで文字列の左側にゼロパディングします。|
|数字を3桁ごとにカンマ区切りする	| String.format("%,d", 123456789)  |	指定数字を3桁毎にカンマ区切りします|

###使い方
**第一引数に、桁数(以下の例では、6桁("%6s"))を設定し、
第二引数にターゲットの文字列を設定します。**
####実装例
```java:test.java
public void formatTest2() {
    // 期待値
    String expected = "123";
    // resultには000123が代入される
    String result = String.format("%6s", "123").replace(" ", "0");
```

##Stream APIの使い方
###filter
中間操作です。
引数には T -> boolean となるラムダ式を渡してます。
式がtrueの要素だけを集めます。

###forEach
forEach の引数には (T) -> void となるラムダ式を渡してあげます。
要素を１つずつ取り出し何らかの処理をする終端操作です。
使い方は以下を参考にしてください。

####実装例
リストに開始時刻と終了時刻がある場合のみ、終了時刻ー開始時刻をして、
所要時間に値をセットするメソッドを例にしています。

```java:calculateDuration.java
    protected List<String> calculateDuration(
            List<String> list) {
        list.stream()
        // 開始時刻と終了時刻両方設定されているものに絞る
        .filter(i -> !Strings.isEmpty(i.getTimeStart()) && !Strings.isEmpty(i.getTimeFin()))
         //終了時刻 - 開始時刻を引き、所要時間にセットする
        .forEach(i -> {
            String duration = Integer.toString(Integer.parseInt(i.getTimeFin()) - Integer.parseInt(i.getTimeStart()));
            i.setDuration(duration);
        });
        return list;
    }
```