91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何解決Java中list.foreach不能使用字符串拼接的問題

發布時間:2021-09-27 09:12:24 來源:億速云 閱讀:354 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關如何解決Java中list.foreach不能使用字符串拼接的問題,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

    list.foreach不能使用字符串拼接

    如圖,不能使用String進行拼接

    因為Lambda的本質實際上是匿名內部類,所以t必須是final類型(不過代碼中的final可以省略),是不可以重新賦值的。

    可以使用

    final StringBuilder str = new StringBuilder("已選擇:");

    如圖二

    如何解決Java中list.foreach不能使用字符串拼接的問題

    如何解決Java中list.foreach不能使用字符串拼接的問題

    foreach循環中不能使用字符串拼接

    問題

    @Test
        public void forEachTest(){
            String str = "中國你好!";
            List<String> list = Arrays.asList("a","b","c","d");        
            list.forEach(item->{
             //編輯錯誤:Variable used in lambda expression should be final or effectively final
                str += item;
            });
            //可以使用增強for
    //        for (String item : list) {
    //            str += item;
    //        }
            System.out.println("結果:" + str);
        }

    該編譯不通過的根本原因:Lambda表達式中的局部變量要使用final的問題。

    因為String類型屬于引用數據類型,String字符串有不可變的特性,String在進行字符串拼接時,每次都會指向不同的地址值,因此str變量不能被看作是一個final類型,也就不符合Lambda表達式的使用要求。

    解決

    使用StringBuffer或StringBuilder:

    @Test
        public void forEachTest(){
            //String str = "中國你好!";
            List<String> list = Arrays.asList("a","b","c","d");
            StringBuffer stringbuffer = new StringBuffer("中國你好!");
            list.forEach(item->{
                stringbuffer .append(item);
            });
            //可以使用增強for
    //        for (String item : list) {
    //            str += item;
    //        }
            System.out.println("結果:" + sb);
        }

    原理 ??

    StringBuffer是一個引用數據類型,在進行append()時,只是修改了內容,并沒有改變地址值,這個stringbuffer變量就在編譯時看成了final類型的變量,因此可以使用。

    Lambda表達式中的局部變量要使用final的問題

    lambda表達式使用局部變量要用final

    lambda表達式本身是一個匿名內部類的一種編寫形式,可以操作外部的變量

    使用實例變量或靜態變量是沒有限制的(可認為是通過 final 類型的局部變量 this 來引用前兩者)

    使用局部變量必須顯式的聲明為 final 或實際效果的的 final 類型,即該變量從未被改變過

    @Test
        public void finalTest(){
            String str = "中國你好!";        
            //在Lambda中使用該變量,該變量不能被修改過,java8會默認加上final
            //str = "c";
            List<String> list = Arrays.asList("a","b","c","d");
            List<String> collect = list.stream().filter(item -> {
                return item.equals(str);
            }).collect(Collectors.toList());
            System.out.println("結果:" + collect);
      //不能改變str,否則Lambda表達式中編譯失敗
      //str = "山東你好";
        }

    一個局部變量如果要在匿名類或是 Lambda 表達式中訪問,那么這個局部變量必須是 final 的,即使沒有修飾為 final 類型,編譯器也會自動加上 final 修飾符。

    在 Java 8 下,即使局部變量未聲明為 final 類型,一旦在 Lambda 表達式(匿名類) 中使用,就被強型加上了 final 屬性,所以后面就無法再次給 str 賦值了。

    為什么 Lambda 表達式(匿名類) 不能訪問非 final 的局部變量呢?

    因為實例變量存在堆中,而局部變量是在棧上分配,Lambda 表達式(匿名類) 會在另一個線程中執行。如果在線程中要直接訪問一個局部變量,可能線程執行時該局部變量已經被銷毀了,而 final 類型的局部變量在 Lambda 表達式(匿名類) 中其實是局部變量的一個拷貝。

    在java編譯時,匿名內部類也會被當作普通的類處理,只不過編譯器生成它構造方法的時候,除了將外部類的引用傳遞了過來,還將基本數據類型的變量復制了一份過來,并把引用數據類型的變量引用也傳遞了過來。因此,基本數據類型的變量當然不能修改了,不然就會跟外部的變量產生不一致,這樣的話變量的傳遞也就變得毫無意義了。

    關于“如何解決Java中list.foreach不能使用字符串拼接的問題”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    和林格尔县| 临潭县| 荆州市| 邻水| 三穗县| 洱源县| 博客| 芮城县| 林甸县| 九江县| 中阳县| 九台市| 呼伦贝尔市| 新竹县| 板桥市| 扶绥县| 墨竹工卡县| 来宾市| 东明县| 高州市| 德兴市| 嘉义县| 城步| 葫芦岛市| 房山区| 靖西县| 武乡县| 新源县| 罗源县| 日喀则市| 玉环县| 盈江县| 永川市| 大厂| 花莲县| 宿迁市| 奉化市| 合肥市| 太谷县| 泽库县| 广灵县|