成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JavaScript如何優雅地告別Cannot read properties of undefined,Optional類體驗

開發 前端
Optional 類是 Java 中解決空指針異常(NullPointerException)的一種方案。(它和 Cannot read properties of undefined 是一樣的錯誤),我們看看沒有 Optional 類的情況

相信很多開發者在開發中經常遇到的一個報錯:

Uncaught TypeError: Cannot read properties of undefined.

圖片圖片

作為一名熟練的前端攻城獅,你一眼就能這是由于讀取一個對象屬性時,對象為 undefined 時導致的。

要想避免,我們需要做下判斷。

let a = fetch(url, params);
a?.result?.map(console.log);

或者你使用 try catch 結構來捕獲異常。

try {
  let a = fetch(url, params);
  a.result.map(console.log);
} catch (err) {
  console.log(err);
}

當然,我們還有很多其他的選擇,這里就不一一列舉了。

接下來我介紹一種我最新學到的方案——Java 的 Optional 類。

Optional 類是 Java 中解決空指針異常(NullPointerException)的一種方案。(它和 Cannot read properties of undefined 是一樣的錯誤),我們看看沒有 Optional 類的情況。

String str = null;
// System.out.println(appendTest.toString());
// 上面會觸發:NullPointerException,下面是常見的應對方法
if (str !== null) {
    System.out.println(str.toString());
} else {
    System.out.println("str is null!!!");
}

但是使用 Optional 就優雅的多了。

String str = null;
// 生成Optional類,ofNullablebiao 生成可以為null的對象
Optional<String> optional = Optional.ofNullable(name);

生成 Optional 類還有 of 方法,不同的是不能為 null,否則調用 ifPresent 依然會報錯 NullPointerException。

ifPresent: 如果存在就打印它,否則不進行任何操作。

optional.ifPresent(str -> System.out.println(str));
// 等價于
optional.ifPresent(System.out::println);

orElseGet:如果存在就返回它,否則執行后面的表達式。

optional.orElseGet(() -> System.out.println("str is null!!"));

除此之外還有很多有意思的接口,比如我們熟悉的:map、flatmap、filter 等。

需要注意的是,因為 Optional 是一個容器類,它的方法返回的仍然是 Optional 對象,所以你可以繼續對返回的 Optional 對象進行鏈式調用。例如:

import java.util.Optional;

public class Person {
    // something
}

public class Main {
    public static void main(String[] args) {
        // 創建一個可能為 null 的 Person 對象
        Person person = new Person("John Doe", 30);

        // 使用 Optional 對象進行鏈式調用
        Optional<Person> optionalPerson = Optional.ofNullable(person)
                .filter(p -> p.getAge() >= 18)
                .map(p -> new Person(p.getName().toUpperCase(), p.getAge())
                .flatMap(p -> Optional.of(new Person(p.getName(), p.getAge() + 1)));

        // 輸出結果
        optionalPerson.ifPresent(p -> System.out.println("Name: " + p.getName() + ", Age: " + p.getAge()));
    }
}

更多信息可以看下面這張截圖:

圖片圖片

這些方法像極了 javascript 的數組方法,但是他們的區別是,在 Java 中,Optional 類主要用于包裝單個對象,以表示一個可能存在或可能不存在的值。它并不直接支持包裝數組。

讓我們回到 javascript,這種方案似乎可以很好的解決前端的問題。好奇的搜索 GitHub,這種方案有很多 javascript 版本的實現。

例如:https://github.com/JasonStorey/Optional.js

const Optional = require("optional-js");

// Define some simple operations
const getUserId = (username) => (username === "root" ? 1234 : 0);

const verify = (userId) => userId === 1234;

const login = (userId) => console.log("Logging in as : " + userId);

// Declare a potentially undefined value
const username = process.argv[2];

// Wrap username in an Optional, and build a pipeline using our operations
Optional.ofNullable(username).map(getUserId).filter(verify).ifPresent(login);

這看起來妙極了?。?!

那么這種方案是怎么實現的呢?關鍵是函數返回值依然是個 Optional 對象。下面我們簡單的實現一下這個過程。

class Optional {
  constructor(value) {
    this.value = value;
  }

  static of(value) {
    return new Optional(value);
  }

  isPresent() {
    return this.value !== undefined && this.value !== null;
  }

  map(mapper) {
    if (this.isPresent()) {
      const mappedValue = mapper(this.value);
      return Optional.of(mappedValue);
    }
    return Optional.ofNullable(null);
  }

  flatMap(mapper) {
    if (this.isPresent()) {
      const mappedValue = mapper(this.value);
      if (mappedValue instanceof Optional) {
        return mappedValue;
      }
      return Optional.ofNullable(mappedValue);
    }
    return Optional.ofNullable(null);
  }

  orElse(defaultValue) {
    return this.isPresent() ? this.value : defaultValue;
  }

  static ofNullable(value) {
    return Optional.of(value);
  }
}

function getNameLength(person) {
  return Optional.ofNullable(person)
    .map((p) => p.name)
    .map((name) => name.length)
    .orElse(0);
}

const person = { name: "John Doe" };
console.log(getNameLength(person)); // 輸出:8

const emptyPerson = null;
console.log(getNameLength(emptyPerson)); // 輸出:0

你覺得這個方案可以嗎?相信大家讀到這里心中已經有答案了吧?

責任編輯:武曉燕 來源: 萌萌噠草頭將軍
相關推薦

2022-07-11 10:51:25

Java 8OptionalNPE

2024-10-15 15:58:11

2021-03-24 10:20:50

Fonts前端代碼

2024-11-13 16:37:00

Java線程池

2025-01-16 08:08:29

2020-03-26 11:04:00

Linux命令光標

2021-01-18 13:17:04

鴻蒙HarmonyOSAPP

2021-05-12 22:07:43

并發編排任務

2022-05-13 21:20:23

組件庫樣式選擇器

2021-01-28 14:53:19

PHP編碼開發

2022-05-24 06:07:48

JShack用戶代碼

2024-04-24 12:34:08

Spring事務編程

2024-12-06 10:12:20

2023-10-08 11:09:22

Optional空指針

2020-10-22 10:15:33

優化Windows電腦

2021-09-08 08:34:37

Go 文檔Goland

2023-02-13 14:37:13

開發web瀏覽器

2018-08-20 10:40:09

Redis位圖操作

2020-12-08 08:08:51

Java接口數據

2020-07-09 10:15:55

空值Bug語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品久久电影 | 日韩av黄色| 中文字幕在线观看国产 | 国产中文视频 | 四虎最新视频 | 免费视频二区 | 成人免费一区二区 | 毛片一区 | av在线播放免费 | 欧美久久久网站 | 欧美性受xxxx白人性爽 | 亚洲综合成人网 | 操操日 | 紧缚调教一区二区三区视频 | 久久久久电影 | 精品产国自在拍 | 精品综合 | 亚洲午夜精品视频 | 影音先锋男 | 中文字幕亚洲欧美日韩在线不卡 | 亚洲视频免费在线看 | 日韩精品无码一区二区三区 | 免费的av网站 | 91久久综合亚洲鲁鲁五月天 | 新超碰97 | 久久久久国产 | 91精品国产综合久久婷婷香蕉 | 中文字幕亚洲一区 | 国产精品日日做人人爱 | 亚洲五码久久 | 日韩美av| 亚洲福利一区 | av在线黄 | 精品三级在线观看 | 国产一区二区欧美 | 亚洲精品久久久久久宅男 | 91精品久久久久久久99 | aaaa网站| 亚洲一区二区三区免费视频 | 日韩午夜一区二区三区 | 精品国产乱码久久久久久88av |