1. 程式人生 > >java匿名內部類以及java8新增的lambda方法

java匿名內部類以及java8新增的lambda方法

說實話啊,本來以為自己的匿名內部類學的還可以,可是在學習hashSet方法中重寫了comparable函式式介面時,居然被這個匿名內部類,弄得自己一頭霧水,真是惱火啊,自己又重新看了一遍,對它有了一定的理解了。
那就通過一個小例子來演示一遍吧,首先你得了解內部類,言簡意賅就是在類之內再定義一個類,不同於子類。包含內部類的類被稱為外部類。內部類有以下幾個特點:
-》內部類提供了更好的封裝,可以把內部類隱藏在外部類之內,不允許通同一個包的其他類訪問該類。
-》內部類成員可以直接訪問外部類的私有資料。
-》***匿名內部類適合於建立那些僅需一次使用的類。也就是所謂的函式式介面。
-》外部類只能用public 或者包限制符,就是沒有修飾符。而內部類可以使用private,protected,static修飾符。
匿名內部類的實現形式是:
new 介面()|父類構造器(實參列表){

    //匿名內部類的類體部分
 }
 下面是一段程式,仿造買東西的過程。
 package niming;

interface Food{
public double getPrice();
public String getName();
}
public class Buy {
public void say(Food f){
System.out.println(“購買了一個”+f.getName()+”,花掉了”+f.getPrice()+”塊錢”);
}
public static void main(String[] args){
Buy buy=new Buy();
buy.say(new Food() {

        @Override
        public double getPrice() {
            // TODO Auto-generated method stub
            return 20;
        }

        @Override
        public String getName() {
            // TODO Auto-generated method stub
            return "蘋果";
        }
    });
}

}

 這是一般的匿名內部類的編碼方式,其實這個就很簡單了,可是oracle就是覺得太麻煩了,於是在java8中又加入了lambda方法。這個lambda方法就是把帶有函式式介面的介面,在實現其匿名內部類時,把能省的程式碼能省既省。所以你就會看到下面匿名內部類實現的部分變成下面這樣(函式式介面:只有一個抽象方法的介面)下面通過一段程式來介紹lambda方法使用。
 package Lambda;

interface Eatable{
void taste();//函式式介面
}
interface Flyable{
void fly(String wwather);
}
interface Addable{
int add(int a,int b);
}
public class LambdaQs {
public void eat(Eatable e){
System.out.println(e);
e.taste();
}
public void drive(Flyable f){
System.out.println(“我正在駕駛:”+f);
f.fly(“美好的晴天!”);
}
public void test(Addable add){
System.out.println(“5和3的和是:”+add.add(5, 3));
}
public static void main(String[] args) {
LambdaQs lQs=new LambdaQs();
lQs.eat(()->System.out.println(“蘋果的味道不錯!”));//1
lQs.drive(weather->{//2
System.out.println(“今天的天氣是:”+weather);
System.out.println(“直升機飛行平穩!”);
lQs.test((a,b)->a+b);//3
});
}
}

 1:在1處繼承了Eatable介面的taste方法,方法體中沒有形參,所以在lambda中就可以用()代替變成了()->,而且它省去重寫方法這個步驟,讓程式碼看起來更簡便。
 2:在2處有形參,故,這是就變成了(形參)->的形式。
 3:在3處,省略了return語句,這是因為lambda表示式會在函式式介面中自己返回一個return語句。
 其中就函式式介面,還有一些java自帶的,主要就是Runnable,ActionListener,Function,以及Arrays方法。
 例如java新增的paralleSort方法。
 Arrays.parallelSort(arr1,(o1,o2)->o1.length()-o2.length());
 這段程式碼的意思是返回字串短的,就是排序,升序排序。

相關推薦

java匿名部類以及java8新增lambda方法

說實話啊,本來以為自己的匿名內部類學的還可以,可是在學習hashSet方法中重寫了comparable函式式介面時,居然被這個匿名內部類,弄得自己一頭霧水,真是惱火啊,自己又重新看了一遍,對它有了一定的理解了。 那就通過一個小例子來演示一遍吧,首先你得了解內部類

JAVA匿名部類以及面試題

匿名內部類,相當於簡化的內部類 前提條件:有一個類(具體類或者抽象類)或者介面。 格式:  new 類名或者介面名() {重寫方法;}                這裡new出來的物

java匿名部類(好處)以及執行緒的實…

內部類啊,方便,簡潔。打個比方,現在有一個介面,規範了某些功能,但是在別的類中突然想使用這個功能,但是又只用一次就行了,如果再建立一個類,實現該介面,然後再呼叫該類,多麻煩啊!既然樓主說到建立執行緒,我就給你寫程式碼,你悟下吧。用匿名內部類建立多執行緒有兩種方式,就和建立一個執行緒是一樣的,一種是繼

匿名部類以及Lambda表示式的理解

首先,我的理解是匿名內部類和lambda的主要作用是簡化程式碼。而且匿名內部類可以實現類似多重繼承的作用。那麼如何建立匿名內部類的物件呢。比較一下如下程式碼這段程式碼輸出456 123第一次a指向匿名內部類,匿名內部類重寫了test方法,所以輸出456,第二次指向類A,所以輸

Java匿名部類Lambda表示式

匿名內部類適合建立那種只需要一次使用的類,而且必須繼承一個父類或者實現一個介面,先看一段程式,該程式功能為實現陣列資料的處理。 定義一個命令模式的介面,然後在處理陣列資料的ProcessArray的類

java匿名部類 (轉載)

demo .cn 抽象方法 tab trac str adding strac oid 匿名內部類也就是沒有名字的內部類 正因為沒有名字,所以匿名內部類只能使用一次,它通常用來簡化代碼編寫 但使用匿名內部類還有個前提條件:必須繼承一個父類或實現一個接口 實例1:不使用匿

java匿名部類的使用註意事項

trac 操作 num abs nal 部分 ets void name 1、首先匿名內部類要繼承自抽象基類或者實現基類接口 like this abstract class Seed{ int cnt; public Seed(int x){ cnt

為什麽說Java匿名部類是殘缺的閉包

pan 年齡 pos 發生 clas 接下來 對象的引用 編譯器 xpl 前言 我們先來看一道很簡單的小題: public class AnonymousDemo1 { public static void main(String args[]) {

java匿名部類

實現 lar 編寫 void pri com href show api show the code : package com.test.jwen.httpApiAuto; public class AInter { publi

理解java匿名部類

dex 基本 stat cell 實例 沒有 div bstr void java中匿名內部類總結 匿名內部類也就是沒有名字的內部類 正因為沒有名字,所以匿名內部類只能使用一次,它通常用來簡化代碼編寫 但使用匿名內部類還有個前提條件:必須繼承一個父類或實現一個接口 實例

#隨筆之java匿名部類

比較 很好 個人 技術 希望 兩個 ava public 類方法 隨筆之java匿名內部類 從今天起開始每日一篇技術博客,當然這只是我當天所學的一些隨筆,裏面或多或少會有理解不當的地方,希望大家多多指教,一起進步! 在講匿名內部類之前,先講講內部類的一些概念。 1.內部類:

java匿名部類舉例

對象 類對象 port str ble 系統 table .get 打籃球 public class Test { public static void main(String[] args) { //4.匿名內部類 //主要是針對那些不能

java匿名部類的使用 (比如new物件後的大括號, List list = new ArrayList() { { }}這用用法等)

今天在看別人的程式碼的時候,發現有 Yyy uu=new Xxx(){ public void aaa(){ //這裡寫程式碼。。。 } } 這種形式,以前偶爾看見過,也知道是匿名內部類的情況,但一直沒有仔細去研究,今天特意花點時間去寫了點很簡單也易懂的例子,初學時需要的技術不在於

詳解Java匿名部類

一、使用匿名內部類內部類 匿名內部類由於沒有名字,所以它的建立方式有點兒奇怪。建立格式如下: new 父類構造器(引數列表)|實現介面() { //匿名內部類的類體部分 } 在這裡我們看到使用匿名內部類我們必須要繼承一個父類或者實現一

java匿名部類的使用 (比如new物件後的大括號, List list = new ArrayList() { { }}這用用法等)

今天在看別人的程式碼的時候,發現有 Yyy uu=new Xxx(){ public void aaa(){ //這裡寫程式碼。。。 } } 這種形式,以前偶爾看見過,也知道是匿名內部類的情況,但一直沒有仔細去研究,今天特意花點時間去寫了點很簡單也易懂的例子,

Java匿名部類中使用外部類方法的形參或區域性變數必須宣告為final

 對於這個問題,首先我們應該明確的一點是對於匿名內部類,它可能引用三種外部變數:外部類的成員變數外部方法或作用域內的區域性變數外部方法的引數而第一種變數是不需要宣告為final的,但後兩種是需要宣告為final的。那這是為什麼呢?不急,我們首先來看第一個知識點。知識點一,匿名內部類同所有類一

java匿名部類序列化問題

遇到一個序列化問題。明明物件已經實現了序列化介面,但是報錯無法序列化外部的類(內心os,跟外部類什麼關係啊)。 最後發現原因是我使用的物件是匿名內部類的子類,繼承的父類實現了序列化介面。 匿名內部類

java 匿名部類說明 及其多執行緒實現繼承Thread,實現Runnable

原文:http://tjukk.iteye.com/blog/2047663 匿名內部類也就是沒有名字的內部類 正因為沒有名字,所以匿名內部類只能使用一次,它通常用來簡化程式碼編寫 但使用匿名內部類還有個前提條件:必須繼承一個父類或實現一個介面 例項1:不使用匿名內部類來實現抽象方法

Java——匿名部類實現執行緒的兩種方式

package com.yy.thread; public class Demo4_Thread { public static void main(String[] args) {

Java匿名部類的傳值

在Nutz中,存在大量需要使用匿名內部類的情況,很多童鞋都對傳值很困惑,所以我這裡說明一下 傳入: //匿名內部類,只能訪問final的本地變數及方法引數publicvoid addUser(finalString name,String passwd,finalStrin