A. lambda950是否有轉換軟體
在java8之前,Java並不支持Lambda表達式,而android目前最新也才支持到Java7特性,所以在Android中使用Lambda表達式需要進行一些處理,將Lambda表達式編譯成Android可以「理解」的方式。 Retrolambda是一個能夠讓我們在Java7中使用Lambda的工具
B. android如何使用lambda表達式
在Java8之前,Java並不支持Lambda表達式,而Android目前最新也才支持到Java7特性,所以在Android中使用Lambda表達式需要進行一些處理,將Lambda表達式編譯成Android可以「理解」的方式。
Retrolambda是一個能夠讓我們在Java7中使用Lambda的工具,再通過gradle-retrolambda插件,在gradle編譯過程中將會:
將Java8中的 javac編譯 Java8的代碼;
將產生的Java8的位元組碼轉換為Java6的位元組碼;
重新打包class。
build.gradle配置文件如下:
buildscript {
repositories {
mavenCentral()
maven {
url "https://oss.sonatype.org/content/repositories/snapshots"
}
}
dependencies {
classpath 'me.tatarka:gradle-retrolambda:1.2.+'
}
}
// Required because retrolambda is on maven central
repositories {
mavenCentral()
}
apply plugin: 'android'
apply plugin: 'retrolambda'
也可以添加如下設置:
retrolambda {
jdk System.getenv("JAVA8_HOME")
javaVersion JavaVersion.VERSION_1_6
}
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
從此以後,
strings.map(new Func1<String, Integer>() {
@Override
public Integer call(String s) {
return s.length();
}
});
可以寫作:
strings.map((String s) -> {
return s.length();
});
至於詳細的bytecode轉換過程,有興趣的同志們可以自己研究研究。
C. java8 lambda 表達式是個什麼
為了支持函數式編程,Java 8引入了Lambda表達式.
在Java 8中採用的是內部類來實現Lambda表達式.具體實現代碼,可以通過debug看, 同時通過位元組碼查看工具及反編譯工具來驗證.
自從lambda表達式成為Java語言的一部分之後,Java集合(Collections)API就面臨著大幅變化。而JSR 355(規定了Java lambda表達式的標准)的正式啟用更是使得Java集合API變的過時不堪。
盡管我們可以從頭實現一個新的集合框架(比如「Collection II」),但取代現有的集合框架是一項非常艱難的工作,因為集合介面滲透了Java生態系統的每個角落,將它們一一換成新類庫需要相當長的時間。因此,我們決定採取演化的策略(而非推倒重來)以改進集合API: 為現有的介面(例如Collection,List和Stream)增加擴展方法;
在類庫中增加新的流(stream,即java.util.stream.Stream)抽象以便進行聚集(aggregation)操作;
改造現有的類型使之可以提供流視圖(stream view);
改造現有的類型使之可以容易的使用新的編程模式,這樣用戶就不必拋棄使用以久的類庫,例如ArrayList和HashMap
(當然這並不是說集合API會常駐永存,畢竟集合API在設計之初並沒有考慮到lambda表達式。我們可能會在未來的JDK中添加一個更現代的集合類庫)。
除了上面的改進,還有一項重要工作就是提供更加易用的並行(Parallelism)庫。盡管Java平台已經對並行和並發提供了強有力的支持,然而開發者在實際工作(將串列代碼並行化)中仍然會碰到很多問題。因此,我們希望Java類庫能夠既便於編寫串列代碼也便於編寫並行代碼,因此我們把編程的重點從具體執行細節(how computation should be formed)轉移到抽象執行步驟(what computation should be perfomed)。
D. 如何在android mole中使用Java 8的新特性,比如Lambda
在Java8之前,Java並不支持Lambda表達式,而Android目前最新也才支持到Java7特性,所以在Android中使用Lambda表達式需要進行一些處理,將Lambda表達式編譯成Android可以「理解」的方式。 Retrolambda是一個能夠讓我們在Java7中使用Lambda的工具,再通過gradle-retrolambda插件,在gradle編譯過程中將會: 將Java8中的 javac編譯 Java8的代碼; 將產生的Java8的位元組碼轉換為Java6的位元組碼; 重新打包class。 build.gradle配置文件如下: buildscript { repositories { mavenCentral() maven { url "https://oss.sonatype.org/content/repositories/snapshots" } } dependencies { classpath 'me.tatarka:gradle-retrolambda:1.2.+' }
E. lambda side是什麼軟體
這個軟體是在調試嵌入式是所用到的調試軟體,LambdaTOOL是一個通用、統一、開放的新一代32位嵌入式軟體集成開發環境,支持多種嵌入式操作系統和32位嵌入式處理器,具備先進的新一代交叉開發環境和系統配置工具,具備支持嵌入式軟體模擬開發的完整功能,具體由下列內容組成:
1)編輯環境
2)系統配置
3)編譯環境
4)目標機管理
5)調試環境
剛開始搞uc/os需要這款調試軟體,所以急需,但是網上搜不到,而且這款軟體是收費軟體,有面向教學的免費版本,但就這個免費版本也找不到。
F. Java8新特性lambda表達式有什麼用
一:因為lambda表達式能夠使代碼看起來更簡潔,清爽
匿名內部類的寫法
List<String>names=Arrays.asList("jack","tom","jerry");
Collections.sort(names,newComparator<String>(){
@Override
publicintcompare(Strings1,Strings2){
returns2.compareTo(s1);
}
});
lambda表達式的寫法
List<String>names=Arrays.asList("jack","tom","jerry");
Collections.sort(names,(s1,s2)->s2.compareTo(s1));
二: 很多編程語言都支持lambda表達式. java不支持都不好意思了......
三: 通過lambda 表達式 來實現函數是編程.將來聲明式編程語言借鑒函數編程思想,函數編程語言融合聲明式編程特性...這幾乎是一種必然趨勢。
G. 關於java8的lambda表達式的問題,求大神解答下
為了支持函數式編程,Java 8引入了Lambda表達式. 在Java 8中採用的是內部類來實現Lambda表達式.具體實現代碼,可以通過debug看, 同時通過位元組碼查看工具及反編譯工具來驗證. 自從lambda表達式成為Java語言的一部分之後,Java集合(Collections)A...
H. Lambda表達式的C#表達式
C#的Lambda 表達式都使用 Lambda 運算符 =>,該運算符讀為「goes to」。語法如下:
形參列表=>函數體
函數體多於一條語句的可用大括弧括起。 可以將此表達式分配給委託類型,如下所示: delegateintdel(inti);delmyDelegate=x=>{returnx*x;};intj=myDelegate(5);//j=25創建表達式目錄樹類型: usingSystem.Linq.Expressions;//...Expression<del>=x=>x*x;=> 運算符具有與賦值運算符 (=) 相同的優先順序,並且是右結合運算符。
Lambda 用在基於方法的 LINQ 查詢中,作為諸如 Where 和 Where 等標准查詢運算符方法的參數。
使用基於方法的語法在 Enumerable 類中調用 Where 方法時(像在 LINQ to Objects 和 LINQ to XML 中那樣),參數是委託類型 System..::.Func<(Of <(T, TResult>)>)。使用 Lambda 表達式創建委託最為方便。例如,當您在 System.Linq..::.Queryable 類中調用相同的方法時(像在 LINQ to SQL 中那樣),則參數類型是 System.Linq.Expressions..::.Expression<Func>,其中 Func 是包含至多五個輸入參數的任何 Func 委託。同樣,Lambda 表達式只是一種用於構造表達式目錄樹的非常簡練的方式。盡管事實上通過 Lambda 創建的對象的類型是不同的,但 Lambda 使得 Where 調用看起來類似。
在前面的示例中,請注意委託簽名具有一個 int 類型的隱式類型輸入參數,並返回 int。可以將 Lambda 表達式轉換為該類型的委託,因為該表達式也具有一個輸入參數 (x),以及一個編譯器可隱式轉換為 int 類型的返回值。(以下幾節中將對類型推理進行詳細討論。)使用輸入參數 5 調用委託時,它將返回結果 25。
在 is 或 as 運算符的左側不允許使用 Lambda。
適用於匿名方法的所有限制也適用於 Lambda 表達式。有關更多信息,請參見匿名方法(C# 編程指南)。 下列規則適用於 Lambda 表達式中的變數范圍:
捕獲的變數將不會被作為垃圾回收,直至引用變數的委託超出范圍為止。
在外部方法中看不到 Lambda 表達式內引入的變數。
Lambda 表達式無法從封閉方法中直接捕獲 ref 或 out 參數。
Lambda 表達式中的返回語句不會導致封閉方法返回。
Lambda 表達式不能包含其目標位於所包含匿名函數主體外部或內部的 goto 語句、break 語句或 continue 語句。
Lambda表達式的本質是「匿名方法」,即當編譯我們的程序代碼時,「編譯器」會自動將「Lambda表達式」轉換為「匿名方法」,如下例: string[]names={agen,balen,coure,apple};string[]findNameA=Array.FindAll<string>(names,delegate(stringv){returnv.StartsWith(a);});string[]findNameB=Array.FindAll<string>(names,v=>v.StartsWith(a));上面中兩個FindAll方法的反編譯代碼如下: string[]findNameA=Array.FindAll<string>(names,delegate(stringv){returnv.StartsWith(a);});string[]findNameB=Array.FindAll<string>(names,delegate(stringv){returnv.StartsWith(a);});從而可以知道「Lambda表達式」與「匿名方法」是可以劃上等號的,只不過使用「Lambda表達式」輸寫代碼看上去更直觀漂亮,不是嗎?
Lambda表達式的語法格式:
參數列表 => 語句或語句塊
其中「參數列」中可包含任意個參數(與委託對應),如果參數列中有0個或1個以上參數,則必須使用括弧括住參數列,如下:
() => Console.Write(0個參數)
I => Console.Write(1個參數時參數列中可省略括弧,值為:{0},i)
(x,y) => Console.Write(包含2個參數,值為:{0}*{1},x,y)
而「語句或語句塊」中如果只有一條語句,則可以不用大括弧括住否則必須使用,如下:
I => Console.Write(只有一條語句)
I => { Console.Write(使用大括弧的表達式); }
//兩條語句時必須要大括弧
I => { i++;Console.Write(兩條語句的情況); }
如果「語句或語句塊」有返回值時,如果只有一條語句則可以不輸寫「return」語句,編譯器會自動處理,否則必須加上,如下示例:
「Lambda表達式」是委託的實現方法,所以必須遵循以下規則:
1)「Lambda表達式」的參數數量必須和「委託」的參數數量相同;
2)如果「委託」的參數中包括有ref或out修飾符,則「Lambda表達式」的參數列中也必須包括有修飾符;
例子: classTest{delegateintAddHandler(intx,inty);staticvoidPrint(AddHandleradd){Console.Write(add(1,3));}staticvoidMain(){Print((x,y)=>x+y);Print((x,y)=>{intv=x*10;returny+v;});Console.Read();}}註: 如果包括有修飾符,則「Lambda表達式」中的參數列中也必須加上參數的類型
3)如果「委託」有返回類型,則「Lambda表達式」的「語句或語句塊」中也必須返回相同類型的數據;
4)如果「委託」有幾種數據類型格式而在「Lambda表達式」中「編譯器」無法推斷具體數據類型時,則必須手動明確數據類型。
例子:
(錯誤代碼) classTest{delegateTAddHandler<T>(Tx,Ty);staticvoidPrint(AddHandler<int>test){Console.WriteLine(inttype:{0},test(1,2));}staticvoidPrint(AddHandler<double>test){Console.WriteLine(doubletype:{0},test(1d,2d));}staticvoidMain(){Print((x,y)=>x+y);Console.Read();}}當我們編譯以下代碼時,編譯器將會顯示以下錯誤信息:
在以下方法或屬性之間的調用不明確:
「ConsoleApplication1.Test.Print(ConsoleApplication1.Test.AddHandler<int>)」和「ConsoleApplication1.Test.Print(ConsoleApplication1.Test.AddHandler<double>)」
所以我們必須明確數據類型給編譯器,如下: Print((intx,inty)=>x+y);這樣我們的代碼就能編譯通過了。