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

Java中不常用的但是很好用的開發小技巧,省事就完了!

開發 前端
關于 BigDecimal 的加減乘除,了不起在這里就不再一一的去給大家說了,畢竟這都是非常基礎的內容,我們來說說需要大家掌握的有用的方法。

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

BigDecimal

關于 BigDecimal 的加減乘除,了不起在這里就不再一一的去給大家說了,畢竟這都是非常基礎的內容,我們來說說需要大家掌握的有用的方法。

我們先來看一段代碼:

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

大家可以猜一下這個執行的結果會是什么內容呢?

結果是 0.1 么?如果不是 0.1 的話,那么執行輸出的話,會出現什么內容,如果你知道,那么恭喜你,如果你不知道的話,那么就得認真學習一下拉。

結果顯而易見,肯定不是 0.1 。

我們看看他的執行結果是什么內容,然后再來說,應該使用什么方式。

0.1000000000000000055511151231257827021181583404541015625

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

其實很簡單,方式有兩種,第一種:

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

第二種:

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

實際上,在本質上,這兩個方法并沒有區別,因為。valueOf 在實現上,就是轉成了一個字符串。

BigDecimal 當中的 valueOf 中是把浮點數轉換成了字符串來構造的 BigDecimal,因此避免了問題。

源碼如下:

圖片

compareTo

這個方法我們經常用到,用來比較 BigDecimal 的,在 BigDecimal 中使用 equals 可能會導致結果錯誤,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 比較的時候,自己臆想的和代碼執行的,肯定不一樣,于是就有了自己實驗的過程。

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

List

說到 List 絕對不陌生,甚至天天在用,List 轉數組,應該怎么操作呢?

其實很簡單,就是 toArray。

toArray

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

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

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

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

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

JDK8的小玩意

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

flatMap

其實這個方法,是真的不常用,因為我們用到的,很多都是 forEach ,或者 filter ,或者 map 這些都是我們比較常用的。

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

就是 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;

}

如果我們想要統計訂單總價,如果 Order 表中已經存在了這個價格這塊的內容了,那當然好,如果沒有,那么就得去匯總詳情了,不是么?

//求和使用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();

其實,了不起覺得,JDK8 中才是真的有很多了不起的內容,再比如我們統計list中的數據,已經不在需要自己去做for循環來進行比對了,而是直接通過方法來獲取。

//獲取最大
Integer id = userList.stream().map(User::getId).max(Integer::compareTo).get();
//獲取最小
Integer id1 = userList.stream().map(User::getId).min(Integer::compareTo).get();
//獲取id數量
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();

分組統計

//分組統計
    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));
    //將名字全轉換為大寫
    List<String> list = userList.stream().map(User::getName).map(String::toUpperCase).collect(Collectors.toList());
    //獲取忽略第一個并取前幾條數據
    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());

關于這些不常用,但是非常有用的內容,你學會了么?

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2021-07-06 11:25:20

Chrome前端代碼

2019-04-18 09:42:31

JavaScript前端開發

2020-12-14 08:30:02

JavaScript開發代碼

2020-12-15 11:34:35

持續集成工具

2011-04-08 17:03:19

Java架構

2011-07-11 10:24:09

PHP

2021-07-02 10:20:15

HTML前端技巧

2021-02-20 22:09:48

Web開發HTML

2021-11-08 10:45:07

Python命令工具

2015-02-04 10:32:57

Objective-CSwift

2009-06-15 15:54:53

Java中Cookie

2011-01-19 09:07:20

Thunderbird

2022-02-10 09:56:33

git revertgit resetGit

2023-12-19 13:30:00

JavaScrip原生API函數

2020-01-30 18:00:18

編程語言軟件人工智能

2020-01-31 18:03:49

編碼開發代碼

2022-02-17 13:58:38

Linux技巧文件

2020-11-11 08:22:40

前端開發JavaScript

2022-01-18 10:15:18

Vue性能優化前端

2011-07-06 16:00:28

ASP
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久久蜜桃一区二区 | 综合成人在线 | 中文字幕在线免费观看 | 亚洲欧美在线一区 | 成人免费观看男女羞羞视频 | 久久人体视频 | 亚洲在线视频 | 日韩一区二区免费视频 | 日日夜夜免费精品 | a免费在线| 日韩一区在线播放 | 久久91av | 亚洲一区在线日韩在线深爱 | 精品久久久久久亚洲综合网 | 中文字字幕一区二区三区四区五区 | 日韩精品一区二区三区在线播放 | 天堂av在线影院 | 国产美女网站 | 中文成人无字幕乱码精品 | 日韩在线播放网址 | 久久新 | 成人在线视频网站 | 亚洲手机视频在线 | 久久婷婷国产麻豆91 | 久久久久国产一级毛片高清网站 | 人人擦人人干 | 九九热国产视频 | 亚洲v区| 超黄毛片 | 91极品视频| 一级毛片视频在线观看 | 日韩精品一区二区三区 | 少妇黄色 | 国产精品成人av | 亚洲精品久 | 日本久草| 国产精品欧美一区二区三区不卡 | 国产精品视频一二三区 | 欧美二区三区 | 欧美日韩精品专区 | 在线免费看黄 |