主頁 > 軟體工程 > java8新特性,你有用起來了嗎?(精編)

java8新特性,你有用起來了嗎?(精編)

2020-09-11 20:23:15 軟體工程

 

2019年9月19日java13已正式發布,感嘆java社區強大,經久不衰,由于國內偏保守,新東西總要放一放,讓其他人踩踩坑,等穩定了才會去用,并且企業目的還是賺錢,更不會因為一個新特性去重構代碼,再開發一套程式出來,甚者國內大多傳統企業還在用java4 、5、6…


今天講一講 java8 的新特性,Java 8 (又稱為 jdk 1.8) 是 Java 語言開發的一個主要版本,Oracle 公司于 2014 年 3 月 18 日發布 Java 8 ,它支持函式式編程,新的日期 API,新的Stream API 等,是Java5之后一個大的版本升級,讓Java語言和庫仿佛獲得了新生,核心新特性包含:

  • Java8 函式式介面− 函式式介面(Functional Interface)就是一個有且僅有一個抽象方法,但是可以有多個非抽象方法的介面,函式式介面可以被隱式轉換為 lambda 運算式,

  • Lambda 運算式 − Lambda 允許把函式作為一個方法的引數(函式作為引數傳遞到方法中),

  • 默認方法 − 默認方法就是一個在介面里面有了一個實作的方法,

  • 方法參考 − 方法參考提供了非常有用的語法,可以直接參考已有Java類或物件(實體)的方法或構造器,與lambda聯合使用,方法參考可以使語言的構造更緊湊簡潔,減少冗余代碼,

  • Stream API −新添加的Stream API(java.util.stream) 把真正的函式式編程風格引入到Java中,

  • Date Time API − 加強對日期與時間的處理,

  • Optional 類 − Optional 類已經成為 Java 8 類別庫的一部分,用來解決空指標例外,


一. 函式式介面

函式式介面(Functional Interface)就是一個有且僅有一個抽象方法,但是可以有多個非抽象方法的介面,
函式式介面可以被隱式轉換為 lambda 運算式,

JDK 1.8 之前已有的函式式介面:

java.lang.Runnablejava.util.concurrent.Callablejava.security.PrivilegedActionjava.util.Comparatorjava.io.FileFilterjava.nio.file.PathMatcherjava.lang.reflect.InvocationHandlerjava.beans.PropertyChangeListenerjava.awt.event.ActionListenerjavax.swing.event.ChangeListener

JDK 1.8 新增加的函式介面:

java.util.function

這里說一下@FunctionalInterface注解,這個注解是java8新出得一個注解,

我們常用的一些介面Callable、Runnable、Comparator等在JDK8中都添加了@FunctionalInterface注解,
在這里插入圖片描述

追蹤原始碼查看@FunctionalInterface注解javadoc

在這里插入圖片描述通過JDK8原始碼javadoc,可以知道這個注解有以下特點:

  • 該注解只能標記在”有且僅有一個抽象方法”的介面上,

  • JDK8介面中的靜態方法和默認方法,都不算是抽象方法,

  • 介面默認繼承Java.lang.Object,所以如果介面顯示宣告覆寫了Object中方法,那么也不算抽象方法,

  • 該注解不是必須的,如果一個介面符合”函式式介面”定義,那么加不加該注解都沒有影響,加上該注解能夠更好地讓編譯器進行檢查,如果撰寫的不是函式式介面,但是加上了@FunctionInterface,那么編譯器會報錯,

@FunctionalInterface標記在介面上,“函式式介面”是指僅僅只包含一個抽象方法的介面,
在這里插入圖片描述

如果一個介面中包含不止一個抽象方法,那么不能使用@FunctionalInterface,編譯會報錯,

在這里插入圖片描述

比如下面這個介面就是一個正確的函式式介面:
在這里插入圖片描述


二. 默認方法

簡單說,默認方法就是介面可以有實作方法,而且不需要實作類去實作其方法,

我們只需在方法名前面加個 default 關鍵字即可實作默認方法,

為什么要有這個特性?

首先,之前的介面是個雙刃劍,好處是面向抽象而不是面向具體編程,缺陷是,當需要修改介面時候,需要修改全部實作該介面的類,目前的 java 8 之前的集合框架沒有 foreach 方法,通常能想到的解決辦法是在JDK里給相關的介面添加新的方法及實作,然而,對于已經發布的版本,是沒法在給介面添加新方法的同時不影響已有的實作,所以引進的默認方法,他們的目的是為了解決介面的修改與現有的實作不兼容的問題,

這里值得注意的是,我們知道java中一個類可以實作多個介面 如果多個介面中有同名同參同回傳值得默認方法需要我們在實作類重寫該方法,否則會編譯報錯,


三. lambda運算式

這是java8的一大重要特性,我們知道java是面向物件語言,把行為封裝成一個物件是我們根深蒂固的java編程思想,但是lambda正好反其道而行之,是一種面向程序的編程思想,

不在贅述更多模糊,概念的含義,大家現在有這樣的一個認識就可以了,下面我會用例子帶入大家,
能夠接收Lambda運算式的引數型別,是一個有且僅有一個抽象方法,但是可以有多個非抽象方法的介面,“函式介面”,可以頂替匿名內部類,

語法:

(parameters) -> expression或(parameters) ->{ statements; }

以下是lambda運算式的重要特征:

  • 可選型別宣告:不需要宣告引數型別,編譯器可以統一識別引數值,

  • 可選的引數圓括號:一個引數無需定義圓括號,但多個引數需要定義圓括號,

  • 可選的大括號:如果主體包含了一個陳述句,就不需要使用大括號,

  • 可選的回傳關鍵字:如果主體只有一個運算式回傳值則編譯器會自動回傳值,大括號需要指定明運算式回傳了一個數值,

老版本Java中排列字串

Collections.sort(names, new Comparator<String>() {    @Override    public int compare(String a, String b) {        return b.compareTo(a);    }});
 

只需要給靜態方法 Collections.sort 傳入一個List物件以及一個比較器來按指定順序排列,通常做法都是創建一個匿名的比較器物件然后將其傳遞給sort方法,

在Java 8 中你就沒必要使用這種傳統的匿名物件的方式了,直接上lambda

Collections.sort(names, (String a, String b) -> {    return b.compareTo(a);});
 

看到了吧,代碼變得更段且更具有可讀性,但是實際上還可以寫得更短:

Collections.sort(names, (String a, String b) -> b.compareTo(a));
 

對于函式體只有一行代碼的,你可以去掉大括號{}以及return關鍵字,但是你還可以寫得更短點:

Collections.sort(names, (a, b) -> b.compareTo(a));
 

據官方檔案中介紹Java編譯器可以自動推匯出引數型別,可以不寫,但是這里我還是建議大家寫出引數型別,方便代碼被其他人閱讀時候的可讀性,自己反過來查看代碼也有幫助,


總結:

缺點 : 學習成本稍高,剛開始接觸不容易理解,并需要反復練習,

優點 : lambda運算式讓我們可以把一個方法當成引數傳遞進另一個方法,頂替匿名內部類消除了樣板式代碼,并讓我們的代碼看起來更加簡潔、干凈,

并且lambda運算式可以在結合很多地方使用,下面涉及我會再分析,總的來說lambda運算式還是值得我們學習的,


四. stream流

Java 8 API添加了一個新的抽象稱為流Stream,可以讓你以一種宣告的方式處理資料,

Stream 使用一種類似用 SQL 陳述句從資料庫查詢資料的直觀方式來提供一種對 Java 集合運算和表達的高階抽象,

Stream API可以極大提高Java程式員的生產力,讓程式員寫出高效率、干凈、簡潔的代碼,

這種風格將要處理的元素集合看作一種流, 流在管道中傳輸, 并且可以在管道的節點上進行處理, 比如篩選, 排序,聚合等,

元素流在管道中經過中間操作(intermediate operation)的處理,最后由最終操作(terminal operation)得到前面處理的結果,

什么是stream?

Stream(流)是一個來自資料源的元素佇列并支持聚合操作,

元素是特定型別的物件,形成一個佇列,Java中的Stream并不會存盤元素,而是按需計算,

資料源 流的來源,可以是集合,陣列,I/O channel, 產生器generator 等,

聚合操作 類似SQL陳述句一樣的操作, 比如filter, map, reduce, find, match, sorted等,

和以前的Collection操作不同, Stream操作還有兩個基礎的特征:

Pipelining: 中間操作都會回傳流物件本身,這樣多個操作可以串聯成一個管道, 如同流式風格(fluent style),這樣做可以對操作進行優化, 比如延遲執行(laziness)和短路( short-circuiting),

內部迭代:以前對集合遍歷都是通過Iterator或者For-Each的方式, 顯式的在集合外部進行迭代, 這叫做外部迭代,Stream提供了內部迭代的方式, 通過訪問者模式(Visitor)實作,

在 Java 8 中, 集合介面有兩個方法來生成流:

stream() − 為集合創建串行流,

parallelStream() − 為集合創建并行流,

在這里插入圖片描述

API:

forEach() Stream 提供了新的方法 ‘forEach’ 來迭代流中的每個資料,以下代碼片段使用 forEach 輸出了10個亂數:

在這里插入圖片描述

limit() 方法用于獲取指定數量的流,以下代碼片段使用 limit 方法列印出 10 條資料:

在這里插入圖片描述

map() 方法用于映射每個元素到對應的結果, 以下代碼片段使用 map 輸出了元素對應的平方數:
distinct() 去重 需要實作hascCode和equase方法

在這里插入圖片描述

filter() 方法用于通過設定的條件過濾出元素,以下代碼片段使用 filter 方法過濾出空字串:

在這里插入圖片描述

sorted 方法用于對流進行排序,以下代碼片段使用 sorted 方法對輸出的 10 個亂數進行排序:

在這里插入圖片描述

并行(parallel)程式

parallelStream 是流并行處理程式的代替方法,以下實體我們使用 parallelStream 來輸出空字串的數量:

在這里插入圖片描述

Collectors 結合 collect()方法后使用 Collectors.joining(String 分隔符) Collectors.toList()變為集合
Collectors 類實作了很多歸約操作,例如將流轉換成集合和聚合元素,Collectors 可用于回傳串列或字串:
在這里插入圖片描述


五. 方法參考

方法參考通過方法的名字來指向一個方法,

方法參考可以使語言的構造更緊湊簡潔,減少冗余代碼,

方法參考使用一對冒號 :: ,

下面,我們在 Car 類中定義了 4 個方法作為例子來區分 Java 中 4 種不同方法的參考,

在這里插入圖片描述

構造器參考:它的語法是Class::new,或者更一般的Class< T >::new實體如下:

      finalCarcar=Car.create(Car::new);      finalList<Car>cars=Arrays.asList(car);
 

靜態方法參考:它的語法是Class::static_method,實體如下:

      cars.forEach(Car::collide);
 

特定類的任意物件的方法參考:它的語法是Class::method實體如下:

      cars.forEach(Car::repair);
 

特定物件的方法參考:它的語法是instance::method實體如下:

      finalCarpolice = Car.create(Car::new);             cars.forEach(police::follow);
 

方法參考實體
在 Java8Tester.java 檔案輸入以下代碼:
在這里插入圖片描述

實體中我們將 System.out::println 方法作為靜態方法來參考,

執行以上腳本,輸出結果為:

在這里插入圖片描述


六. 日期時間 API

Java 8通過發布新的Date-Time API (JSR 310)來進一步加強對日期與時間的處理,

因為Java的DateCalendar型別使用起來并不是很方便,而且Date類(據說)有著執行緒不安全等諸多弊端,同時若不進行封裝,會在每次使用時特別麻煩,于是Java8推出了執行緒安全、簡易、高可靠的時間包,并且資料庫中也支持LocalDateTime型別,在資料存盤時候使時間變得簡單,Java8這次新推出的包括三個相關的時間型別:LocalDateTime年月日十分秒;LocalDate日期;LocalTime時間;三個包的方法都差不多,

列出常用api,詳細的使用網上大片,大家自行查找:

//獲取當前時間的LocalDateTime物件//LocalDateTime.now();//根據年月日構建LocalDateTime//LocalDateTime.of(); //比較日期先后//LocalDateTime.now().isBefore(),//LocalDateTime.now().isAfter(),
 

七. Optional 類

Optional不是對null關鍵字的一種替代,而是對于null判定提供了一種更加優雅的實作,

NullPointException可以說是所有java程式員都遇到過的一個例外,雖然java從設計之初就力圖讓程式員脫離指標的苦海,但是指標確實是實際存在的,而java設計者也只能是讓指標在java語言中變得更加簡單、易用,而不能完全的將其剔除,所以才有了我們日常所見到的關鍵字null,

空指標例外是一個運行時例外,對于這一類例外,如果沒有明確的處理策略,那么最佳實踐在于讓程式早點掛掉,但是很多場景下,不是開發人員沒有具體的處理策略,而是根本沒有意識到空指標例外的存在,

當例外真的發生的時候,處理策略也很簡單,在存在例外的地方添加一個if陳述句判定即可,但是這樣的應對策略會讓我們的程式出現越來越多的null判定,我們知道一個良好的程式設計,應該讓代碼中盡量少出現null關鍵字,而java8所提供的Optional類則在減少NullPointException的同時,也提升了代碼的美觀度,但首先我們需要明確的是,它并 不是對null關鍵字的一種替代,而是對于null判定提供了一種更加優雅的實作,從而避免NullPointException,

1). 直觀感受

假設我們需要回傳一個字串的長度,如果不借助第三方工具類,我們需要呼叫str.length()方法:

if(null == str) { // 空指標判定return 0;}return str.length();
 

如果采用Optional類,實作如下:

return Optional.ofNullable(str).map(String::length).orElse(0)

Optional的代碼相對更加簡潔,當代碼量較大時,我們很容易忘記進行null判定,但是使用Optional類則會避免這類問題,

2). 基本使用
1.物件創建
Optional<String> optStr = Optional.empty();

上面的示例代碼呼叫empty()方法創建了一個空的Optional物件型,

創建物件:不允許為空
Optional提供了方法of()用于創建非空物件,該方法要求傳入的引數不能為空,否則拋NullPointException,示例如下:

// 當str為null的時候,將拋出NullPointExceptionOptional<String> optStr = Optional.of(str);
2. 創建物件:允許為空
如果不能確定傳入的引數是否存在null值的可能性,則可以用Optional的ofNullable()方法創建物件,如果入參為null,則創建一個空物件,示例如下:
// 如果str是null,則創建一個空物件Optional<String> optStr = Optional.ofNullable(str);
3.流式處理
流式處理也是java8給我們帶來的一個重量級新特性,讓我們對集合的操作變得更加簡潔和高效,

這里Optional也提供了兩個基本的流失處理:映射和過濾,

為了演示,我們設計了一個User類,如下:

public class User {/** 用戶編號 */private long id;private String name;private int age;private Optional<Long> phone;private Optional<String> email;public User(String name, int age) {this.name = name;this.age = age;}// 省略setter和getter}
 

手機和郵箱不是一個人的必須有的,所以我們利用Optional定義,

映射:map與flatMap

映射是將輸入轉換成另外一種形式的輸出的操作

比如前面例子中,我們輸入字串,而輸出的是字串的長度,這就是一種隱射,我們利用方法map()得以實作,假設我們希望獲得一個人的姓名,那么我們可以如下實作:

String name = Optional.ofNullable(user).map(User::getName).orElse("no name");
 

這樣當入參user不為空的時候則回傳其name,否則回傳no name

如果我們希望通過上面方式得到phone或email,利用上面的方式則行不通了,因為map之后回傳的是Optional,我們把這種稱為Optional嵌套,我們必須在map一次才能拿到我們想要的結果:

long phone = optUser.map(User::getPhone).map(Optional::get).orElse(-1L);
 

其實這個時候,更好的方式是利用flatMap,一步拿到我們想要的結果:

long phone = optUser.flatMap(User::getPhone).orElse(-1L);
過濾:fliter

iliter,顧名思義是過濾的操作,我們可以將過濾操作做為引數傳遞給該方法,從而實作過濾目的

假如我們希望篩選18周歲以上的成年人,則可以實作如下:

optUser.filter(u -> u.getAge() >= 18).ifPresent(u -> System.out.println("Adult:" + u));
4.默認行為

默認行為是當Optional為不滿足條件時所執行的操作,比如在上面的例子中我們使用的orElse()就是一個默認操作,用于在Optional物件為空時執行特定操作,當然也有一些默認操作是當滿足條件的物件存在時執行的操作,

get()

get用于獲取變數的值,但是當變數不存在時則會拋出NoSuchElementException,所以如果不確定變數是否存在,則不建議使用


orElse(Tother)

當Optional的變數不滿足給定條件時,則執行orElse,比如前面當str為null時,回傳0,


orElseGet(Supplier<? extends X> expectionSupplier)

如果條件不成立時,需要執行相對復雜的邏輯,而不是簡單的回傳操作,則可以使用orElseGet實作:

long phone = optUser.map(User::getPhone).map(Optional::get).orElseGet(() -> {// do something herereturn -1L;});

 orElseThrow(Supplier<? extends X> expectionSupplier)

與get()方法類似,都是在不滿足條件時回傳例外,不過這里我們可以指定回傳的例外型別,


ifPresent(Consumer<? super T>)

當滿足條件時執行傳入的引數化操作,


3). 注意事項

Optional是一個final類,未實作任何介面,所以當我們在利用該類包裝定義類的屬性的時候,如果我們定義的類有序列化的需求,那么因為Optional沒有實作Serializable介面,這個時候執行序列化操作就會有問題:

public class User implements Serializable{/** 用戶編號 */private long id;private String name;private int age; private Optional<Long> phone;  // 不能序列化private Optional<String> email;  // 不能序列化不過我們可以采用如下替換策略:private long phone;public Optional<Long> getPhone() {return Optional.ofNullable(this.phone);}

今天分享到此結束,通過本篇文章了解java8的新特性不僅強大而且感覺很多地方都能馬上使用起來,比如通過stream流處理集合資料結合lambda寫出高效、干凈、簡潔的代碼,通過Optional類優雅的處理NPE,rd們裝X的最高境界就是寫一手其他rd們看不懂又覺得很高大上的代碼了吧,哈哈哈,,,本著學習的態度,如果文章內有出入地方請指出,看到留言后我會和大家討論學習,

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/7258.html

標籤:其他

上一篇:獻禮20周年! 互聯網研發管理現狀主題分享

下一篇:百度大腦EdgeBoard計算卡基于Resnet50/Mobile-SSD模型的性能評測

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more