今日の記録3 主に java


sourceコマンドとは

ファイルに書かれたコマンドを現在のシェルで実行する。
シェルの設定ファイル(環境設定等)の内容をログインし直さず、即座に反映させたい時に役立つ。

Java

unmodifiableList

呼び出し元でaddやremoveが出来なくなる。読み取り専用となる。

Javaオーバーライド

戻り値の変更もオーバーライドで出来ると思ったけどできなかった。

オーバーライドする側とオーバーライドされる側の戻り値の型、メソッド名、引数の型、引数の数、引数の並び順が同じであること。
http://www.techscore.com/tech/Java/JavaIntro/7/

Map

MapのentrySetとkeySet

keySetはkeyの情報だけを必要とする場合に、
entrySetはkeyとvalue両方を必要とする場合に
それぞれ使い分ける。

補足: エントリ(キーと値のペア)

サンプルコード: キーと値両方取り出したい場合

map.entrySet().stream().forEach(e -> System.out.println(e.getKey()+e.getValue())

サンプルコード: キーだけを取り出したい場合

map.keySet().stream().forEach(System.out::println);

サンプルコード:値だけを取り出したい場合

map.entrySet().stream().map(Map.Entry::getValue).forEach(System.out::println);

ストリームからコレクションや配列などを生成する方法

例:7文字のキーのみををリストに変換

List<String>list=
   map.keySet().stream().filter(e->e.matches("\\w{7}")).collect(Collectors.toList());

様々な型変換のやり方はp258を参考にする

多次元配列をループを使わずにプリントする方法

参考サイト:https://teratail.com/questions/102877

4×13のtable配列が宣言されていたとする。
各要素はトランプの絵柄に対応して順に数字が入っている。


Card[][] table = new Card[Card.SUIT_NUM][Card.CARD_NUM];
    table[0][1] = new Card(1, 2);
    table[1][4] = new Card(2, 5);
    table[2][5] = new Card(3, 6);
    List<Card[]> cards = Arrays.asList(table);
    cards.stream().map(Arrays::toString).forEach(System.out::println);
// Arrays.deepToStringでも出来る
// System.out.print(Arrays.deepToString(table).replaceAll("],",
// System.lineSeparator()).replaceAll("null", ".."));
//必要に応じて、replaceAllで文字を置換する

出力結果

[null, S2, null, null, null, null, null, null, null, null, null, null, null]
[null, null, null, null, D5, null, null, null, null, null, null, null, null]
[null, null, null, null, null, C6, null, null, null, null, null, null, null]
[null, null, null, null, null, null, null, null, null, null, null, null, null]

解説:
cards.stream().map(Arrays::toString).forEach(System.out::println);
map: 各要素の変換(各要素を倍にする等)
::  : ダブルコロンはメソッド参照 と呼ばれる。  
     クラスメソッドやインスタンスメソッドをLambdaの実装として利用することが出来る。

並列処理のオーバーヘッド

並列化処理をすると早くなると言われているが、オーバーヘッドの可能性もあるため、逆に遅くなることもある。

並列化オーバーヘッドについての参考サイト
http://web.yl.is.s.u-tokyo.ac.jp/pl/abclf/ipa-final/reports/html/5/6/node23.html

実装テクニック

Javaは参照渡しなので、読み取りだけを目的としたメソッド(特にget)の実装は注意する。
Listをgetするのであれば、unmodifiableListを使う