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")
);
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());
わかりやすくて短くてとっても良いです。
Intとかにしか使えませんが、もっと短く書くためのショートカットもあります。
itemList.sort(Comparator.comparingInt(SimpleEntry<Integer, String>.getKey))
ショートカットがあるのは便利ですね。乱用して可読性が下がらないように気をつけないと・・・
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));
ぬるぽを撲滅というか、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チェックが働いているので、実行すると何も表示されません。
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を終端操作というらしいです。
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使ってきたいなと思った次第です・・・