您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“Java中不常用的開發技巧有哪些”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Java中不常用的開發技巧有哪些”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
我們先來看一段代碼:
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
,因此避免了問題。
源碼如下:
這個方法我們經常用到,用來比較 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 轉數組,應該怎么操作呢?
其實很簡單,就是 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 ,升級版本的,還并不是那么的多,畢竟很少有公司會吧之前的項目隨便更換某些必要的依賴的版本號,除非迫不得已。
其實這個方法,是真的不常用,因為我們用到的,很多都是 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中不常用的開發技巧有哪些”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。