自學(xué)java的心得體會(huì)分享
學(xué)習(xí)路徑
在學(xué)習(xí)Java的相關(guān)知識(shí)時(shí),必須先確立一條學(xué)習(xí)路徑,這方面可以參考國(guó)內(nèi)互聯(lián)網(wǎng)公司的Java相關(guān)職位的技術(shù)要求。個(gè)人是一名純Java后端,我建議的學(xué)習(xí)路徑是Java基礎(chǔ)->Mysql->mybatis->Spring Boot->SpringCloud->Redis,這些都是目前國(guó)內(nèi)大部分互聯(lián)網(wǎng)公司都會(huì)使用的技術(shù)棧。當(dāng)對(duì)這些都有一定了解后個(gè)人建議可以去了解一些中間件或擴(kuò)展知識(shí),如消息中心(RocketMQ、Kafka)、Nginx、ELK(ElasticSearch+Logtash+Kibana)、Docker+Kubernetes+Rancher等。
學(xué)習(xí)方法
在學(xué)習(xí)期間一定要多敲代碼操作,個(gè)人建議再簡(jiǎn)單的知識(shí)點(diǎn)最好到敲碼驗(yàn)證一下,并在敲的過(guò)程中要思考清楚這個(gè)類/方法的主要作用是什么,并在此之上思考在實(shí)際開(kāi)發(fā)中可以用到什么地方。

Java基礎(chǔ)
Java基礎(chǔ)類中常見(jiàn)的函數(shù)式接口Function、Predicate、Consumer、BiConsumer等,對(duì)這些接口有所了解的都知道Java的Stream、Map、Optional等類中有不少方法的參數(shù)都是這些函數(shù)式接口的,最常見(jiàn)的用法就是Map的foreach(BiConsumer)、List的foreach(Consumer)、List.stream()轉(zhuǎn)Stream后的一系列函數(shù)式操作,但從書(shū)籍/網(wǎng)站上了解到這些知識(shí)以一回事,有沒(méi)有實(shí)際測(cè)試過(guò)放到項(xiàng)目中又是另一回事。每次我自己去編碼驗(yàn)證知識(shí)點(diǎn)成功后都會(huì)感到成就感,然后會(huì)思索能不能再擴(kuò)展到其它地方使用。
以從List中提取屬性轉(zhuǎn)Map為例,最原生的做法就是將List轉(zhuǎn)Stream再函數(shù)式提取,如下:
MapidNameMap = list.stream() .collect(Collectors.toMap(Classify::getId, Classify::getName));
后來(lái)覺(jué)得這樣需要兩行且需要轉(zhuǎn)Stream(每調(diào)用stream方法后進(jìn)行換行可以提高流程轉(zhuǎn)換的可讀性),可不可以通過(guò)函數(shù)式編程簡(jiǎn)化為一行并保證可讀性,于是我寫了一個(gè)工具類去完成這件事:
public staticMap collectToMap(Collection list, Function keyGetter) {
MappropertiesMap = new HashMap<>(list.size());
list.forEach(e -> propertiesMap.put(keyGetter.apply(e), e));
return propertiesMap;
}
當(dāng)時(shí)在這過(guò)程中用到的Function函數(shù)式接口也提高了我對(duì)函數(shù)式編程的理解,轉(zhuǎn)換的代碼也成了以下這個(gè)樣子:
MapidMap = ListUtils.collectToMap(list,Classify::getId,Classify::getName);
雖然這不是什么了不起的知識(shí)點(diǎn)與編碼,但實(shí)踐過(guò)程中帶來(lái)的提升遠(yuǎn)非僅僅觀看帶來(lái)的提升高的。
框架/工具學(xué)習(xí)
所謂的框架只是基于基礎(chǔ)搭建達(dá)到某些功能的工具集合,使用合適的框架可以很好的避免重復(fù)造輪子耗費(fèi)的成本,但對(duì)于框架的核心流程還是需要理解的,這樣才可以再實(shí)際開(kāi)發(fā)中靈活去使用與擴(kuò)展,所以個(gè)人推薦框架學(xué)習(xí)的方式是:了解其功能->功能的核心加載流程->嘗試根據(jù)自己的想法進(jìn)行擴(kuò)展。

以SpringBoot為例,SpringBoot為我們大大的縮減了項(xiàng)目搭建所需要的實(shí)際,其為大部分開(kāi)發(fā)者都默認(rèn)設(shè)置好了常用的配置值,當(dāng)默認(rèn)配置不是我們想要的時(shí)候我們只需在配置文件中更改即可。SpringBoot的自動(dòng)化配置雖然可以省去不少麻煩,但如果我們有些想要的自動(dòng)化配置SpringBoot沒(méi)有提供怎么辦?那這時(shí)我們就需要了解SpringBoot自動(dòng)化配置的加載流程,并據(jù)此方式自定義一套我們自己的自動(dòng)化配置,所以在學(xué)習(xí)每個(gè)框架前我都會(huì)先了解該框架的核心是哪。個(gè)人當(dāng)初在了解了SpringBoot的加載流程后也寫了全局參數(shù)校驗(yàn)、Swagger自動(dòng)化配置、自己使用的SpringBoot common框架,當(dāng)自己想搭點(diǎn)功能測(cè)試時(shí)也可以快速的添加自己所需要的腳架依賴。
tips:SpringBoot的自動(dòng)化配置流程是讀取classpath:META-INF/
spring.factories
(即resources/spring.factories)文件中的配置類,然后再生成該配置類容器bean,并根據(jù)該類的掃描配置生成所需bean,配置文件的提示是根據(jù)META-INF/
spring-configuration-metadata.json
中的內(nèi)容進(jìn)行提示的,可以在spring boot的各種集成框架下找到這些文件,spring-boot-autoconfigure依賴包中存放了自動(dòng)化配置加載流程的功能類。知識(shí)總結(jié)
當(dāng)學(xué)習(xí)完一套技術(shù)知識(shí)點(diǎn)后,個(gè)人建議可以做一下總結(jié),因?yàn)榭偨Y(jié)的過(guò)程是一個(gè)知識(shí)梳理的過(guò)程,可以加深對(duì)知識(shí)的理解,如我之前在使用RocketMQ作為消息中心編碼測(cè)試并項(xiàng)目發(fā)布后也寫了一篇Spring Boot RocketMQ的使用方式與消息中心的架構(gòu)設(shè)計(jì)及作用,在總結(jié)完后我是可以感到自己在這方面知識(shí)理解的提升的。
知識(shí)總結(jié)個(gè)人建議可以總結(jié)到筆記軟件(如目前個(gè)人的筆記用的是Boostnote)上或者博客上,既能方便日后回顧,又可添加自己的潛在價(jià)值(大公司是有一套根據(jù)博客點(diǎn)贊與瀏覽量篩選候選人的方式的,即使學(xué)歷不足,但只要你的博客展示出你強(qiáng)硬的技術(shù)水平,不用擔(dān)心找不到想要的面試機(jī)會(huì))。

