むずむずしたJavaコード


むずむずしたJavaコード

普段Javaをつかった開発に従事させていただいてますが、
読む機会のあったコードの中で、おこがましいですが
「ううう、こう書いてもいいのでは」とむずむずすることがありました。

今回はそういったむずっとくるコードを改善するコードを記載できればと思います。

foreach

class Member {
   private String name;
   private int age;
   // ...AllConfigConstructor,getter,setter
}

List<Member> members = List.of(
        new Member("Tom", 21)
        , new Member("Gomez", 19)
        , new Member("Ame", 10));

Map<String, Member> teens = new HashMap<>();
members.stream().forEach(member -> {
    if (member.getAge() < 20 && member.getAge() > 9) {
        teens.put(member.getName(), member);
    }
});

foreachで条件合致するオブジェクトはmapに詰めるといった記述をみました。
streamのなにをしたいかが読める感じが好きなのに、
foreach内でいろいろやられると命令的に読む内容が増える。ううう。(例は簡単ですが)

filterとCollectorsつかって書き直すならこんな感じかと。

Map<String, Member> teens = members.stream()
        .filter(member -> member.getAge() < 20 && member.getAge() > 9)
        .collect(Collectors.toMap(Member::getName , Function.identity()));

条件分岐は別で考えたい。filterで中身を整えたあとにmapに変換したい。
newの初期化も消える。

Optional.isPresent()

ラップオブジェクトでNullPointerException回避のためにも
よくつかっているのですが、isPresentとかifPresentとか使い分けがなかなか難しい。
ううう。


Optional<Member> opMember = Optional.ofNullable(member).filter(m -> m.getAge() > 50);
if (opMember.isPresent()) {
    execute(opMember.get().getAge());
}

とか

Optional<Member> opMember = Optional.ofNullable(member).filter(m -> m.getAge() > 50);
String target;
if (opMember.isPresent()) {
    target = opMember.getName();
} else {
    target = null;
}
// ...

Optional.isPresent()で判定して、値があるならなにかしらの
処理をする、もしくは値を取り出す記述を見ました。
Optionalはもっと便利につかえるはず。

Optional.ofNullable(member)
        .filter(m -> m.getAge() > 50)
        .ifPresent(m -> execute(m.getAge()));

戻りがないならifPresentにConsumerとして渡してあげられるし

String seniorMemberName
        = Optional.ofNullable(member)
        .filter(m -> m.getAge() > 50)
        .map(Member::getName)
        .orElse(null);

Optionalもmapメソッドをもってて
空っぽであれば空のOptionalを返してくれるので便利。
if文をかかなくていいし。

ちょっとした使い方覚えるとif文とか書かなくてよくなるので
やっぱりJavadoc見たりした方がいいですね。

小さな現場からは以上です。

※上記の改善側にもむずむずする方もいらっしゃるとは思います。
その時はご指摘いただけると幸いです。
題材が少なすぎてどうにもならんかもですが。