日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

一、redis使用過程中一些小的注意點

1、不要把Redis當成數據庫來使用

二、Arrays.asList常見失誤

需求:把數組轉成list集合去處理。

方法:Arrays.asList 或者 JAVA8的stream流式處理

1)錯誤一

以下代碼是否有問題?

int[] arr  = {1, 2, 3};
List list = Arrays.asList(arr);
System.out.println(list);
System.out.println(list.size());
System.out.println(list.get(0).getClass());

日志:

[[I@4232c52b]
1
class [I

為什么打印出來的,不是我們想要的?

Java業務開發常見錯誤

 

可以看到入參是泛型T類型可變參數,把 int數組 整體作為對象成為了T 傳入了。

如何解決?

Integer[] arr2  = {1, 2, 3};
List list2 = Arrays.asList(arr2);
System.out.println(list2);
System.out.println(list2.size());
System.out.println(list2.get(0).getClass());

日志:

[1, 2, 3]
3
class java.lang.Integer

總結:不能直接使用Arrays.asList來轉換基本類型數組。

 

2)錯誤二

現在我們已經轉成list集合了,我們接下來,進行后續業務操作。

Integer[] arr2  = {1, 2, 3};
List list2 = Arrays.asList(arr2);
list2.add(4);
System.out.println(list2);

這時候,一運行,又報錯了!

java.lang.UnsupportedOperationException
	at java.util.AbstractList.add(AbstractList.java:148)
	at java.util.AbstractList.add(AbstractList.java:108)
	at ListTest.test2(ListTest.java:30)

ListTest.java:30 是代碼中的 list2.add(4);

原因:

Java業務開發常見錯誤

 


Java業務開發常見錯誤

 


Java業務開發常見錯誤

 

發現:Arrays.asList返回的List并不是java.util.ArrayList,而是Arrays內部類ArrayList,它沒有覆寫父類的add方法,所以調用會報錯。

解決:

重新new一個ArrayList初始化Arrays.asList返回的List即可。

Integer[] arr2  = {1, 2, 3};
List list2 = Arrays.asList(arr2);
ArrayList list3 = new ArrayList(list2);
list3.add(4);
System.out.println(list3);

總結:Arrays.asList返回的List不支持增刪操作。

3)錯誤三

Integer[] arr2  = {1, 2, 3};
List list2 = Arrays.asList(arr2);
arr2[1] = 6;
System.out.println(list2);

日志:

[1, 6, 3]

發現:對原始數組的修改影響到了我們獲得的那個List。

解決:

重新new一個ArrayList初始化Arrays.asList返回的List即可。

Integer[] arr2  = {1, 2, 3};
ArrayList list3 = new ArrayList(Arrays.asList(arr2));
arr2[1] = 6;
System.out.println(list3);

日志:

[1, 2, 3]

總結:對原始數組的修改影響到了我們獲得的那個List。

三、日志記錄常見問題

四、Java8常見使用

1)Lambda表達式

1、目的

Lambda表達式的初衷是進一步簡化匿名類的語法。

2、簡單實例

//匿名類
new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("hello1");
    }
}).start();
//lambda表達式

new Thread(() -> System.out.println("hello1")).start();

在idea中快捷鍵:Alt + Enter 會看到提示,自動轉成lambda表達式

Java業務開發常見錯誤

 

2)Stream操作

1、功能說明

可以對集合進行投影,轉換,過濾,排序等操作。

2、準備工作

創建四個實體類,用于下方Demo的使用。

Java業務開發常見錯誤

 


Java業務開發常見錯誤

 


Java業務開發常見錯誤

 

3、創建流

3、創建流

創建流程一般有五種方式。

ream方法把List或數組轉換成流

/**
 * list ==> 流
 */
List<String> list = Arrays.asList("a1", "a2", "a3");
list.stream().forEach(System.out::println);
/**
 * 數組 ==> 流
 */
Arrays.stream(new int[]{1, 2, 3}).forEach(System.out::println);

b.通過stream.of方法直接傳入多個元素構成一個流程

String[] arr = {"a", "b", "c"};
Stream.of(arr).forEach(System.out::println);
Stream.of("a", "b", "c").forEach(System.out::println);
Stream.of(1, 2, "a").forEach(System.out::println);

c.通過Stream.iterate方法使用迭代的方式構造一個無限流,然后使用limit限制流元素個數

Stream.iterate(2, item -> item * 2).limit(2).forEach(System.out::println);
Stream.iterate(BigInteger.ZERO, n -> n.add(BigInteger.TEN)).limit(3).forEach(System.out::println);

d.通過Stream.generate方法從外部傳入一個提供元素的Supplier來構造無限流,

然后使用limit限制流元素個數。

Stream.generate(() -> "test").limit(3).forEach(System.out::println);
Stream.generate(Math::random).limit(3).forEach(System.out::println);

e.通過IntStream或DoubleStream構造基本類型的流

IntStream.range(1, 5).forEach(System.out::println);
DoubleStream.of(1.1, 2.2, 3.3).forEach(System.out::println);

4、filter 過濾

可以實現過濾操作,類似SQL中的where,可以連續疊加filter方法進行多次過濾。

orders.stream()
        .filter(order -> order.getTotalPrice() > 40)
        .filter(order -> order.getCustomerId() == 1)
        .forEach(System.out::println);

5、map 轉換

可以做轉換(就是投影),類似于SQL中的select。

通過map,可以把對象轉換成其他對象。

a、小寫轉大寫

List<String> a = Arrays.asList("a", "b", "c", "d");
List<String> b = a.stream().map(String::toUpperCase).collect(Collectors.toList());
System.out.println(a);
System.out.println(b);

b、對象列表轉字符串列表

List<String> collect = 
orders.stream().map(x -> x.getCustomerName())
.collect(Collectors.toList());
System.out.println(collect);

c、對象列表轉其他對象列表

List<User> users = customers.stream().map(temp -> {
    User user = new User();
    user.setCustomerId(temp.getId());
    user.setName(temp.getName());
    return user;
}).collect(Collectors.toList());

6、flatMap 展開

相當于 map + flat,通過map把每一個元素替換成一個流,然后展開這個流。

7、sorted 排序

可以用于排序,類似于SQL中的 order by。

orders.stream()
        .filter(order -> order.getTotalPrice() > 40)
        .sorted(Comparator.comparing(Order::getTotalPrice).reversed())
        .limit(2)
        .forEach(System.out::println);

8、distinct 去重

作用是去重,類似于SQL中的distinct。

List<String> list = 
Arrays.asList("AA", "BB", "CC", "AA", "BB");
System.out.println(list);//[AA, BB, CC, AA, BB]
List<String> collect = list.stream().distinct().collect(Collectors.toList());
System.out.println(collect);//[AA, BB, CC]

9、skip 和 limit 分頁

用于分頁,類似于MySQL中的limt。

skip實現跳過一定的項,limit用于限制項總數。

customers.stream()
 .sorted(Comparator.comparing(Customer::getId).reversed())
        .map(customer -> customer.getId() + "@" + customer.getName())
        .limit(2).forEach(System.out::println);
        //10@姓名10
        //9@姓名9
customers.stream()
 .sorted(Comparator.comparing(Customer::getId).reversed())
        .map(customer -> customer.getId() + "@" + customer.getName())
        .skip(2).limit(2).forEach(System.out::println);
        //8@姓名8
        //7@姓名7

10、collect 收集

收集操作,對流程進行終止操作。(終止意思是,后面無法再串聯其他操作)

其他終止操作還有 forEach,toArray,min,max,cout,anyMatch等等。

#所有下單的用戶,使用toSet去重后實現字符串的拼接
String collect = orders.stream()
        .map(order -> order.getCustomerName())
        .collect(Collectors.toSet())
        .stream().collect(Collectors.joining(",", "[", "]"));
System.out.println(collect);  //[李四,張三]
#使用toCollection收集器指定集合類型
LinkedList<Order> collect = orders.stream()
        .limit(2)
        .collect(Collectors.toCollection(LinkedList::new));
System.out.println(collect);

Collectors類的一些常用靜態方法:

Java業務開發常見錯誤

 

【注意】Lambda表達式有個很大的缺點,就是不方便調試。

【解決】

1、使用2020.01版本的IDEA編輯器

https://www.jetbrains.com/help/idea/analyze-java-stream-operations.html

2、使用peek方法

3)Optional類型

4)并行流

5)日期時間類

1、簡單介紹

在Java8之前處理日期時間時,使用Date,Calender 和 SimpleDateFormat,使用不方便。

而且無法申明時區。

 

2、項目背景

背景:

去年做的realme的pk大賽,服務器使用的是utc時間(世界標準時間),而Pk賽是印度的項目,業務邏輯需要使用印度時間。

解決:

寫了一個UTC轉印度時間的工具類,把new出來的時間往后加五個半小時,就是印度時間。


https://shimo.im/docs/yJggDyvktT8DJdhc/ 《【pk大賽】服務器UTC時間解決方案》

Java業務開發常見錯誤

 

 

3、解決方案

1、對于Date類

  • Date 并無時區問題,世界上任何一臺計算機使用 new Date() 初始化得到的時間

都一樣。因為,Date 中保存的是 UTC 時間,UTC 是以原子鐘為基礎的統一時間,不以

太陽參照計時,并無時區劃分。

  • Date 中保存的是一個時間戳,代表的是從 1970 年 1 月 1 日 0 點(Epoch 時間)到現在的毫秒數。

2、時區問題

如果不理會時區問題,會導致什么現象呢?

五、如何定位線上問題

1)Arthas工具的使用

官方文檔:
https://alibaba.github.io/arthas/

開源地址:
https://github.com/alibaba/arthas/blob/master/README_CN.md

1、什么是Arthas

是Alibaba開源的Java診斷工具。

2、可以解決什么問題(摘抄自官網)

  • 這個類從哪個 jar 包加載的?為什么會報各種類相關的 Exception?
  • 我改的代碼為什么沒有執行到?難道是我沒 commit?分支搞錯了?
  • 遇到問題無法在線上 debug,難道只能通過加日志再重新發布嗎?
  • 線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現!
  • 是否有一個全局視角來查看系統的運行狀況?
  • 有什么辦法可以監控到JVM的實時運行狀態?
  • 怎么快速定位應用的熱點,生成火焰圖?

3、如何安裝

分享到:
標簽:Java
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定