欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中l(wèi)ist.foreach不能使用字符串拼接的問題

 更新時間:2021年09月26日 17:05:47   作者:hashdog  
這篇文章主要介紹了Java中l(wèi)ist.foreach不能使用字符串拼接的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

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

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

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

可以使用

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

如圖二

foreach循環(huán)中不能使用字符串拼接

問題

    @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("結(jié)果:" + str);
    }

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

因為String類型屬于引用數(shù)據(jù)類型,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("結(jié)果:" + sb);
    }

原理   

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

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

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

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

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

使用局部變量必須顯式的聲明為 final 或?qū)嶋H效果的的 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("結(jié)果:" + collect);
  //不能改變str,否則Lambda表達式中編譯失敗
  //str = "山東你好";
    }

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

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

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

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

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

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解決maven啟動Spring項目報錯的問題

    解決maven啟動Spring項目報錯的問題

    下面小編就為大家分享一篇解決maven啟動Spring項目報錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • Java算法設(shè)計與分析分治算法

    Java算法設(shè)計與分析分治算法

    這篇文章主要介紹了Java算法設(shè)計與分析分治算法,一般分治算法在正文中分解為兩個即以上的遞歸調(diào)用,并且子類問題一般是不想交的
    2022-07-07
  • java新特性之for循環(huán)最全的用法總結(jié)

    java新特性之for循環(huán)最全的用法總結(jié)

    下面小編就為大家?guī)硪黄猨ava新特性之for循環(huán)最全的用法總結(jié)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • SpringBoot實現(xiàn)配置文件的替換

    SpringBoot實現(xiàn)配置文件的替換

    這篇文章主要介紹了SpringBoot實現(xiàn)配置文件的替換,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java如何實現(xiàn)讀取txt文件內(nèi)容并生成Word文檔

    Java如何實現(xiàn)讀取txt文件內(nèi)容并生成Word文檔

    本文主要介紹了通過Java實現(xiàn)讀取txt文件中的內(nèi)容,并將內(nèi)容生成Word文檔。文章的代碼非常詳細,具有一定的學習價值,感興趣的小伙伴可以了解一下
    2021-12-12
  • SpringBoot自動裝配原理詳解

    SpringBoot自動裝配原理詳解

    這篇文章主要介紹了SpringBoot自動裝配原理的相關(guān)資料,幫助大家更好的理解和學習使用SpringBoot框架,感興趣的朋友可以了解下
    2021-03-03
  • Spring集成Web環(huán)境的實例詳解

    Spring集成Web環(huán)境的實例詳解

    這篇文章主要介紹了Spring集成Web環(huán)境,本文通過實例圖文相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • Java Proxy機制詳細解讀

    Java Proxy機制詳細解讀

    這篇文章主要介紹了Java Proxy機制詳細解讀,還是非常不錯的,這里分享給大家,需要的朋友可以參考下。
    2017-10-10
  • java String 轉(zhuǎn)成Double二維數(shù)組的方法

    java String 轉(zhuǎn)成Double二維數(shù)組的方法

    下面小編就為大家?guī)硪黄猨ava String 轉(zhuǎn)成Double二維數(shù)組的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • java.lang.ExceptionInInitializerError初始化程序中的異常錯誤的解決

    java.lang.ExceptionInInitializerError初始化程序中的異常錯誤的解決

    java.lang.ExceptionInInitializerError?異常在?Java?中表示一個錯誤,該錯誤發(fā)生在嘗試初始化一個類的靜態(tài)變量、靜態(tài)代碼塊或枚舉常量時,本文就來介紹并解決一下,感興趣的可以了解一下
    2024-05-05

最新評論