Java今まで知らなかった基礎構文メモ

Created 2019年4月22日12:05
Updated 2019年4月22日14:33
Categories Java

最近改めてJavaの勉強をする機会がありました。

JavaはAndroidアプリ書いたことあるから楽勝かなーとか思っていたのですが、実際やってみると思ったより知らないことが多くて驚きました。

本記事では、学習していて便利だったことを書いていきます。正直めっちゃ基礎的な事が多く、今更だろみたいな感じですがご容赦ください。

※とりあえず記事書いた感じなのでまだ実行して試してません。ほんとごめんなさい・・・

ソート

まず、リストを準備します(List使えみたいな制限があったのでMapじゃなくてSimpleEntryを使っています)。

List<SimpleEntry<Integer, String>> itemList = Arrays.asList(
    new SimpleEntry(2, "AAA"),
    new SimpleEntry(3, "AAAA"),
    new SimpleEntry(1, "AA"),
    new SimpleEntry(4, "A")
);

Comparator

itemList.sort(new Comparator<Item>() {
    @Override
    public int compare(SimpleEntry<Integer, String> item1, SimpleEntry<Integer, String> item2) {
        // キーで昇順にソート
        return item1.getKey() - item2.getKey();
        // キーで降順にソート
        return item2.getKey() - item1.getKey();
        // 文字数で昇順にソート
        return item1.getValue().length() > item2.getValue().length();
    }
});

匿名クラスを作ってその中にソートの処理を定義するパターンです。

ラムダ式

Pythonのlist.sortみたいな感じでもっと短く書く事ができます。

itemList.sort((item1, item2) -> item1.getKey() > item2.getKey());

わかりやすくて短くてとっても良いです。

Comparator.comparingInt

Intとかにしか使えませんが、もっと短く書くためのショートカットもあります。

itemList.sort(Comparator.comparingInt(SimpleEntry<Integer, String>.getKey))

ショートカットがあるのは便利ですね。乱用して可読性が下がらないように気をつけないと・・・

MapやListとforEach

Map型やList型の変数はforEachにラムダ式が使えます。

Map<String, Integer> testMap = new HashMap<String, Integer>() {
    {
        put("A", 1);
        put("B", 2);
        put("C", 3);
        put("D", 4);
    }
};
testMap.forEach((key, value) -> System.out.println(key + ": " + value));

Optional.ofNullable

ぬるぽを撲滅というか、nullチェックをきれいに書けるやり方がありました。

String test1 = null;
Optional<String> nullableTest1 = Optional.ofNullable(test1);
// nullチェック方法1
nullableTest1.ifPresent(nonNullTest1 -> System.out.println(nonNullTest1));
// nullチェック方法2
if (nullableTest1.isPresent) {
    System.out.println(nullableTest1.get());
}

test1に対してnullチェックが働いているので、実行すると何も表示されません。

Map

List<String> strList = Arrays.asList("aaa", "aab", "acc", "ddd");
strList.stream().map(item -> item.replace("a", "")).forEach(item -> System.out.println(item));

各文字列のaが半角スペースに置き換わった文字列が表示されます。mapを中間操作、forEachを終端操作というらしいです。

Count

List<Integer> strList = Arrays.asList(1, 2, 3, 4);
System.out.println(strList.stream().count());
System.out.println(strList.stream().filter(item -> item > 2).count());

まずは全てのアイテムの数を出力して、次にfilterで3以上のアイテムだけを抽出した数を出力しています。

もっと複雑なプログラムが必要と思っていましたが、streamを使う事ですっきり書く事ができます。

所感

今までJava知らなすぎ問題でした。こんなに便利な機能があったんですね。

もっとJava使ってきたいなと思った次第です・・・

コメントを投稿

コメント