2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Optional型でのnullの扱い

Posted at

Optionalって?

Optionalとは、nullかもしれないことを注意するクラスだよ。
大抵はメソッドの戻り値がnullかもしれない場合に利用しするよ。
Optional型で返すと、nullの場合はヌルポによる意図しないエラーをなくすことができるし、nullかもしれない値に何か処理を行いたい場合にも利用できるよ。
実際に使ってみよう。

具体例

もしOptional型を使わなかったら...

Javaではよくヌルポが発生するので、nullかどうかのチェックをする必要があるよ。
こんな感じに。

public class Main {
    public static void main(String[] args) {
    String val = "Hello!";
        if (val != null) {
            System.out.print(val + "Java");
        }
    }
}

面倒なnullチェックをなくせるOptional型を使ってみよう。

基本的な使い方

Optional型で戻り値がnullの可能性がない場合は、of()を、ofNullable()を使うよ。
of()の使い方はこちら。

import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        final Optional<String> str = Optional.of("nullではありません。");
        System.out.print(str);
    }
}
// 処理結果
nullではありません。

ofNullable()の使い方はこちら。値を持っていた場合はその値を、値を持っていなかった場合はorElse()に記載した内容が返るように設定できるよ。

import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        String val = null;
        final var sample = Optional.ofNullable(val).orElse("nullです。");
        System.out.print(sample);
// 処理結果
nullです。

他にもorElseGet()orElseThrow()などの値を返すこともできるよ。今回は省略するよ。他によく使うメソッドを紹介するよ。

filter()

値が存在し、それが指定されたものに一致する場合はその値を記述するOptionalを返し、そうでない場合は空のOptionalを返すよ。

import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        final Optional<String> val = Optional.of("ABC");
        final Optional<String> valFilter = val.filter(r -> r.length() > 5);
        System.out.print(valFilter);
    }
}
// 処理結果
Optional.empty

ifPresent()

ifPresent()はインスタンスに、値が存在する場合はtrueを返し、ラムダ式を実行するよ。

import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        final Optional<String> val = Optional.of("nullではありません。");
        val.ifPresent(r -> System.out.println(r));
// 処理結果
nullではありません。

ifPresentOrElse()

ifPresentOrElse()はインスタンスに、値が存在する場合は第一引数で指定したラムダ式を、値が存在しない場合は第二引数で指定したラムダ式を実行するよ。

import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        final Optional<String> val = Optional.empty();
        val.ifPresentOrElse(
            r -> System.out.println(r),
            () -> System.out.println("空です。"));
// 処理結果
空です。

map()

map()は、処理結果を持ったOptionalのインスタンスを新たに生成して、その参照を戻すメソッドだよ。

import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        final Optional<String> val = Optional.of("abc");
        final Optional<String> mapVal = val.map(r -> r.toUpperCase());
        System.out.println(val);
        System.out.println(mapVal);
// 処理結果
Optional[abc]
Optional[ABC]

flatMap()

通常のmap()でOptional型に変換すると、Optional<Optional<?>>といった入れ子構造になってしまうけど、flatMap()を使うと要素の次元を下げることができるよ。

import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        final Optional<String> val_1 = Optional.of("ABC");
        final Optional<String> val_2 = val_1.flatMap(r -> "ABC".equals(r)
            ? Optional.of(r + "DEF")
            : Optional.empty()
        );
        System.out.print(val_2);
// 処理結果
Optional[ABCDEF]

まとめ

以上がOptionalについての解説だよ。nullかもしれない値が返ってくる場合は、Optional型を使って書くのがいいね。

2
2
0

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
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?