ホームページ >Java >&#&チュートリアル >Javaで空判定を実装する方法

Javaで空判定を実装する方法

王林
王林転載
2023-05-13 16:34:061141ブラウズ

    1. はじめに

    実際のプロジェクトではnull検証が必要な箇所が多く、null検証を行わないとNullPointerExceptionが発生する可能性があります。 。

    まずは実際のプロジェクトでの null 判定方法をいくつか見てみましょう

    Javaで空判定を実装する方法

    if (ObjectUtil.isNotNull(vo.getSubmitterId())) {
        userIds.add(vo.getSubmitterId());
    }
    if (StringUtils.isNotBlank(vo.getBudgetPM())) {
        userIds.add(Long.valueOf(vo.getBudgetPM()));
    }
    if (CollUtil.isNotEmpty(vo.getOriginatorList())) {
        userIds.addAl1(vo.getOriginatorList().stream();
    }

    通常、オブジェクトが Null かどうかを判定しますが、java.util の Objects を使用できます。 .nonNull(obj)、hutool の ObjectUtil または直接 null != obj

    2. List の Null 判定

    List のような特殊な項目は、空のプロジェクト内の非 null を判定するだけではありません。 List の場合、null に等しくなく、List.size() は 0 に等しくありません。2 つの異なる点があります。社内のインターンはこれら 2 つをよく混同します。list が null に等しくない場合は、リストが null に等しくないことを意味します。初期化されており、それに属するヒープ メモリの一部があります。サイト、およびサイズ 0 は、そこに何も置かれていないことを意味します。たとえば、null に等しくない場合は、現在ボトルがあることを意味します. サイズが 0 より大きい場合は、ボトルに水を入れたことを意味します。

    実際のプロジェクトでは list.isEmpty() を直接判定に利用していることも分かりましたのでソースコードを見てみます:

    public boolean isEmpty() {
        return size == 0;
    }

    これは水の有無を判定するのと同じですボトル内 (ボトルがすでに存在する場合、ボトルが存在しない場合は NullPointerException がスローされます)。

    そのため、通常 list != null && list.size > 0 を判定に使用するか、HuTool の CollUtil ツールの isEmpty を直接使用します。 Set や Map などもあります。

    3. 文字列の null 判定

    ここではボトルや水の概念がそのまま使われており、String が null の場合は、equals(String) やlength() が呼び出され、java.lang.NullPointerException がスローされます。

    Javaで空判定を実装する方法

    空の文字列を検出するにはいくつかの方法があります:

    1. ほとんどの人が使用する方法の 1 つで、直感的で便利ですが、非効率的です:

    if(a == null || a.equals(""));

    2. 文字列の長さを効率的に比較します:

    if(a == null || a.length() == 0);

    3. Java SE 6.0は提供が始まったばかりで、効率は方法2とほぼ同じです。 :

    if(a == null || a.isEmpty());

    もちろん、org.apache.commons.lang を使用することもできます。 StringUtils ツール。

    StringUtils.isNotBlank(a);

    * StringUtils.isNotBlank(null) = false

    * StringUtils.isNotBlank("") = false

    * StringUtils.isNotBlank(" ") = false

    * StringUtils.isNotBlank("bob") = true

    * StringUtils.isNotBlank(" bob ") = true

    このツール クラスには isNotEmpty() メソッドもあります。この 2 つの違いは、コメントから明確にわかります。

    StringUtils.isNotEmpty(a);

    * StringUtils.isNotEmpty(null) = false

    * StringUtils.isNotEmpty("") = false

    * StringUtils.isNotEmpty(" ") = true

    * StringUtils.isNotEmpty("bob") = true

    * StringUtils.isNotEmpty(" bob ") = true

    4. Optional

    Optional の外観NullpointException を防ぐために使用されます。一般的なメソッドは次のとおりです。

    • .empty(): 空のオプションのインスタンスを作成します。

    • .of(T t): オプションのインスタンスを作成します。 nullの場合は例外が報告されます

    • .ofNullable(T t): tがnullでない場合はOptionalインスタンスを作成し、それ以外の場合は空のインスタンスを作成します

    • isPresent(): コンテナーに値があるかどうかを判断します。

    • ##ifPresent(Consume lambda): コンテナーが空でない場合は、括弧

    • orElse(T t): コンテナ内の要素を取得します。コンテナが空の場合は、括弧内のデフォルト値を返します

    • #orElseGet(Supplier s): 呼び出し元のオブジェクトに value が含まれている場合はその値を返し、それ以外の場合は s
    • によって取得された値を返します。orElseThrow(): 空の場合は、定義された値をスローします。例外、そうでない場合は、現在のオブジェクトを返します
    • map(Function f): 値がある場合は、それを処理し、処理されたオプションを返します。それ以外の場合は、Optional.empty()を返します
    • flatMap(Function mapper ): Map と同様、戻り値は Optional
    • T get(): コンテナ内の要素を取得します。コンテナが空の場合、NoSuchElement 例外がスローされます
    • まず一般的な例を見てみましょう:

    baseInfo クラスには Boolean 型の属性があります。空の場合は false を返し、空でない場合はその値を取得するため、4 行が必要になります。

    boolean blind = false;
    if (null != baseInfo.getBlind()){
        blind = baseInfo.getBlind();
    }

    Optional を使用すると、非常にエレガントな 1 行で実行できます。

    boolean blind = Optional.ofNullable(baseInfo.getBlind()).orElse( other: false);

    4.1 オプションのオブジェクトの作成

    public final class Optional<T> {
        private static final Optional<?> EMPTY = new Optional<>();
        private final T value;
        //可以看到两个构造方格都是private 私有的
        //说明 没办法在外面new出来Optional对象
        private Optional() {
            this.value = null;
        }
        private Optional(T value) {
            this.value = Objects.requireNonNull(value);
        }
        //这个静态方法大致 是创建出一个包装值为空的一个对象因为没有任何参数赋值
        public static<T> Optional<T> empty() {
            @SuppressWarnings("unchecked")
            Optional<T> t = (Optional<T>) EMPTY;
            return t;
        }
        //这个静态方法大致 是创建出一个包装值非空的一个对象 因为做了赋值
        public static <T> Optional<T> of(T value) {
            return new Optional<>(value);
        }
        //这个静态方法大致是 如果参数value为空,则创建空对象,如果不为空,则创建有参对象
        public static <T> Optional<T> ofNullable(T value) {
            return value == null ? empty() : of(value);
        }
    }

    4.2 使用シナリオ

    シナリオ 1: サービス層でオブジェクトをクエリし、返された後、それが空かどうかを判断して処理しますit

    Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
    Optional.ofNullable(task).orElseThrow(() -> new ProcessException(ErrorCodeEnum,SYSIEM ERROR));

    シナリオ 2: オプションの関数型プログラミングを使用し、1 行で完了

    Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
    Map<String,String> map = new HashMap<>( initialCapacity: 8);
    Optional.ofNullable(task).ifPresent(d -> map.put("taskId",d.getTaskDefinitionKey()));

    以上がJavaで空判定を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。