最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中不常用但很好用的開發(fā)小技巧分享

 更新時間:2023年04月27日 09:21:56   作者:Java極客技術(shù)  
其實(shí)干 Java 開發(fā),必然離不開一些計(jì)算,所以就會經(jīng)常用到 BigDecimal ,今天小編就來給大家分項(xiàng)一下那些不怎么常用,但是非常有用的方法,需要的可以參考一下

其實(shí)干 Java 開發(fā),必然離不開一些計(jì)算,比如如果你現(xiàn)在工作是服務(wù)與銀行,那么就會對金額這些計(jì)算非常敏感,所以就會經(jīng)常用到 BigDecimal ,如果你入職的是其他行業(yè)的公司,可能用的就相對沒這么多,今天了不起就來給大家分項(xiàng)一下那些不怎么常用,但是非常有用的方法。

BigDecimal

關(guān)于 BigDecimal 的加減乘除,了不起在這里就不再一一的去給大家說了,畢竟這都是非?;A(chǔ)的內(nèi)容,我們來說說需要大家掌握的有用的方法。

我們先來看一段代碼:

BigDecimal?b1=?new?BigDecimal(0.1);
System.out.println(b1);

大家可以猜一下這個執(zhí)行的結(jié)果會是什么內(nèi)容呢?

結(jié)果是 0.1 么?如果不是 0.1 的話,那么執(zhí)行輸出的話,會出現(xiàn)什么內(nèi)容,如果你知道,那么恭喜你,如果你不知道的話,那么就得認(rèn)真學(xué)習(xí)一下拉。

結(jié)果顯而易見,肯定不是 0.1 。

我們看看他的執(zhí)行結(jié)果是什么內(nèi)容,然后再來說,應(yīng)該使用什么方式。

0.1000000000000000055511151231257827021181583404541015625

當(dāng)看到這個內(nèi)容的,很多人恍然大悟,一眼就看出來,精度丟失了,所以導(dǎo)致了這種情況的發(fā)生,成這種問題的原因是 0.1 這個數(shù)字計(jì)算機(jī)是無法精確表示的,送給 BigDecimal 的時候就已經(jīng)丟精度了.double類型 那么我們應(yīng)該怎么去處理這個 double 類型的參數(shù)呢?

其實(shí)很簡單,方式有兩種,第一種:

BigDecimal?bigDecimal?=?new?BigDecimal("0.1");
System.out.println(bigDecimal);

第二種:

BigDecimal?bigDecimal1?=?BigDecimal.valueOf(0.1);
System.out.println(bigDecimal1);

實(shí)際上,在本質(zhì)上,這兩個方法并沒有區(qū)別,因?yàn)椤?code>valueOf 在實(shí)現(xiàn)上,就是轉(zhuǎn)成了一個字符串。

BigDecimal 當(dāng)中的 valueOf 中是把浮點(diǎn)數(shù)轉(zhuǎn)換成了字符串來構(gòu)造的 BigDecimal,因此避免了問題。

源碼如下:

compareTo

這個方法我們經(jīng)常用到,用來比較 BigDecimal 的,在 BigDecimal 中使用 equals 可能會導(dǎo)致結(jié)果錯誤,BigDecimal 中提供了 compareTo 方法,在很多時候需要使用 compareTo 比較兩個值。如下所示:

????????BigDecimal?b1?=?new?BigDecimal("10.0");
????????BigDecimal?b2?=?new?BigDecimal("10.00");
????????System.out.println(b1.equals(b2));
????????System.out.println(b1.compareTo(b2));

我們肯定遇到過這種,用 compareTo 比較的時候,自己臆想的和代碼執(zhí)行的,肯定不一樣,于是就有了自己實(shí)驗(yàn)的過程。

出現(xiàn)此種結(jié)果的原因是,equals不僅比較了值是否相等,還比較了精度是否相同。示例中,由于兩個值的精度不同,所有結(jié)果也就不相同。而 compareTo 是只比較值的大小。返回的值為-1(小于),0(等于),1(大于)。

List

說到 List 絕對不陌生,甚至天天在用,List 轉(zhuǎn)數(shù)組,應(yīng)該怎么操作呢?

其實(shí)很簡單,就是 toArray。

toArray

List<String>?list?=?new?ArrayList<>();

String[]?strings?=?list.toArray(new?String[list.size()]);

兩個方法,不帶參數(shù)的 toArray 就是直接調(diào)用 Arrays.copyOf(elementData, size),將 List 中的元素對象的引用裝在一個新的生成數(shù)組中。

帶參數(shù)的則是會返回指定類型(必須為 List 元素類型的父類或本身)的數(shù)組對象,如果 a.length 小于 List 元素個數(shù)就直接調(diào)用 Arrays 的 copyOf() 方法進(jìn)行拷貝并且返回新數(shù)組對象,新數(shù)組中也是裝的 List 元素對象的引用,否則先調(diào)用System.arraycopy()將 List 元素對象的引用裝在a數(shù)組中,如果a數(shù)組還有剩余的空間,則在 a[size] 放置一個 null,size 就是 list 中元素的個數(shù),這個 null 值可以使得 toArray(T[] a) 方法調(diào)用者可以判斷 null 后面已經(jīng)沒有 list 元素了.

其實(shí)在業(yè)務(wù)中,我們更多的都是直接使用第二個,第一個五參數(shù)的方法,很多時候都是作為測試來存在的。

JDK8的小玩意

其實(shí)了不起更想說的,還是 JDK8 中的一些肖操作,他會精簡我們的代碼,而且,邏輯也更加的清晰,為什么這么說,因?yàn)楝F(xiàn)在百分之八九十的公司都還是在使用 JDK8 ,升級版本的,還并不是那么的多,畢竟很少有公司會吧之前的項(xiàng)目隨便更換某些必要的依賴的版本號,除非迫不得已。

flatMap

其實(shí)這個方法,是真的不常用,因?yàn)槲覀冇玫降?,很多都?nbsp;forEach ,或者 filter ,或者 map 這些都是我們比較常用的。

而 flatMap 相當(dāng)于 map+flat,通過 map 把每一個元素替換為一個流,然后展開這個流。比如,我們要統(tǒng)計(jì)所有訂單的總價(jià)格,可以有兩種方式:

就是 Order 里面有一個 Detail 的信息,而這個 Order 是一個 List  而 Detail 也是一個 List,就比如下面

public?class?Order?{

private?String?id;

private?List<Detail>?details;

}

public?class?Order?{

private?String?productId;

private?Double?productPrice;

private?Integer?productQuantity;

}

如果我們想要統(tǒng)計(jì)訂單總價(jià),如果 Order 表中已經(jīng)存在了這個價(jià)格這塊的內(nèi)容了,那當(dāng)然好,如果沒有,那么就得去匯總詳情了,不是么?

//求和使用flatMap
orders.stream().flatMap(order?->?order.getDetails().stream()).mapToDouble(item?->?item.getProductQuantity()?*?item.getProductPrice()).sum();


//求和使用flatMapToDouble
orders.stream().flatMapToDouble(order ->order.getDetails().stream().mapToDouble(item -> item.getProductQuantity()?* item.getProductPrice())).sum();

其實(shí),了不起覺得,JDK8 中才是真的有很多了不起的內(nèi)容,再比如我們統(tǒng)計(jì)list中的數(shù)據(jù),已經(jīng)不在需要自己去做for循環(huán)來進(jìn)行比對了,而是直接通過方法來獲取。

//獲取最大
Integer?id?=?userList.stream().map(User::getId).max(Integer::compareTo).get();
//獲取最小
Integer?id1?=?userList.stream().map(User::getId).min(Integer::compareTo).get();
//獲取id數(shù)量
long?count?=?userList.stream().map(User::getId).count();
//總和
int?sum?=?userList.stream().mapToInt(User::getId).sum();
//獲取平均值
double?d?=?userList.stream().mapToInt(User::getId).average().getAsDouble();

分組統(tǒng)計(jì)

??//分組統(tǒng)計(jì)
????Map<String,?Long>?map?=?userList.stream().collect(Collectors.groupingBy(User::getName,?Collectors.counting()));
??//分組?Collectors.groupingBy(屬性名)
?Map<Integer,?List<Person>>?map?=?list.stream().collect(Collectors.groupingBy(Person::getAge));
????//將名字全轉(zhuǎn)換為大寫
????List<String>?list?=?userList.stream().map(User::getName).map(String::toUpperCase).collect(Collectors.toList());
????//獲取忽略第一個并取前幾條數(shù)據(jù)
????List<User>?list1?=?userList.stream().skip(1).limit(2).collect(Collectors.toList());
????//distinct()?去重;collect(Collectors.toList())。封裝成集合
????List<User>?collect?=?userList.stream().distinct().collect(Collectors.toList());

關(guān)于這些不常用,但是非常有用的內(nèi)容,你學(xué)會了么?

到此這篇關(guān)于Java中不常用但很好用的開發(fā)小技巧分享的文章就介紹到這了,更多相關(guān)Java開發(fā)技巧內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實(shí)現(xiàn)udp通訊的代碼

    java實(shí)現(xiàn)udp通訊的代碼

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)udp通訊的代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • 全網(wǎng)最新Log4j?漏洞修復(fù)和臨時補(bǔ)救方法

    全網(wǎng)最新Log4j?漏洞修復(fù)和臨時補(bǔ)救方法

    Apache?Log4j?遠(yuǎn)程代碼執(zhí)行漏洞,如何快速修復(fù)log4j2漏洞,本文給大家介紹下Log4j?漏洞修復(fù)和臨時補(bǔ)救方法,感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • 使Java的JButton文字隱藏功能的實(shí)現(xiàn)(不隱藏按鈕的前提)

    使Java的JButton文字隱藏功能的實(shí)現(xiàn)(不隱藏按鈕的前提)

    這篇文章主要介紹了使Java的JButton文字隱藏功能的實(shí)現(xiàn)(不隱藏按鈕的前提),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Java中的ArrayList底層源碼分析

    Java中的ArrayList底層源碼分析

    這篇文章主要介紹了Java中的ArrayList底層源碼分析,通過下標(biāo)讀取元素的速度很快,這是因?yàn)锳rrayList底層基于數(shù)組實(shí)現(xiàn),可以根據(jù)下標(biāo)快速的找到內(nèi)存地址,接著讀取內(nèi)存地址中存放的數(shù)據(jù),需要的朋友可以參考下
    2023-12-12
  • spring boot整合Cucumber(BDD)的方法

    spring boot整合Cucumber(BDD)的方法

    本篇文章主要介紹了spring boot整合Cucumber(BDD)的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • 如何使用GSON解析JSON數(shù)據(jù)

    如何使用GSON解析JSON數(shù)據(jù)

    這篇文章主要介紹了如何使用GSON解析JSON數(shù)據(jù),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Spring boot項(xiàng)目打包成jar運(yùn)行的二種方法

    Spring boot項(xiàng)目打包成jar運(yùn)行的二種方法

    這篇文章主要給大家介紹了關(guān)于Spring boot項(xiàng)目打包成jar運(yùn)行的二種方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • java接口性能優(yōu)化技巧

    java接口性能優(yōu)化技巧

    這篇文章主要為大家介紹了java接口性能優(yōu)化技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Spring Boot 從靜態(tài)json文件中讀取數(shù)據(jù)所需字段

    Spring Boot 從靜態(tài)json文件中讀取數(shù)據(jù)所需字段

    本文重點(diǎn)給大家介紹Spring Boot 從靜態(tài)json文件中讀取數(shù)據(jù)所需字段,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧
    2018-05-05
  • Java的函數(shù)方法詳解(含漢諾塔問題)

    Java的函數(shù)方法詳解(含漢諾塔問題)

    漢諾塔問題是一個經(jīng)典的遞歸問題,下面這篇文章主要給大家介紹了關(guān)于Java函數(shù)方法(含漢諾塔問題)的相關(guān)資料,文中通過圖文以及代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11

最新評論

太仆寺旗| 汉阴县| 柏乡县| 垫江县| 武城县| 海门市| 藁城市| 昌邑市| 华阴市| 平原县| 沙坪坝区| 龙江县| 璧山县| 汉阴县| 喀什市| 大兴区| 罗田县| 遵义市| 简阳市| 错那县| 庆城县| 石泉县| 若尔盖县| 堆龙德庆县| 石屏县| 阿巴嘎旗| 依安县| 达尔| 双辽市| 定兴县| 平山县| 泾川县| 大埔县| 兴宁市| 平潭县| 平顺县| 当雄县| 徐闻县| 普兰店市| 桃园市| 金溪县|