LoginSignup
7
4

More than 1 year has passed since last update.

むずむずしたJavaコード

Posted at

むずむずした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見たりした方がいいですね。

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

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

7
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4