大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

Java8新特性
Java9新特性

Java8中Lambda表達(dá)式

Lambda 表達(dá)式,也可稱為閉包,它是推動 Java 8 發(fā)布的最重要新特性。

Lambda 允許把函數(shù)作為一個方法的參數(shù)(函數(shù)作為參數(shù)傳遞進(jìn)方法中)。

使用 Lambda 表達(dá)式可以使代碼變的更加簡潔緊湊。

Lambda是數(shù)學(xué)中的一個函數(shù). Java中使用方法來代替函數(shù),方法總是作為類或?qū)ο蟮囊徊糠执嬖诘摹?/p>

可以把Lambda看作是一個匿名方法, 擁有更簡潔的語法。

Lambda語法

語法:

(參數(shù)列表) -> {語句;}

Lambda表達(dá)式由參數(shù)列表和一個Lambda體組成, 通過箭頭連接。

說明:

● 當(dāng)只有一個參數(shù)時, 參數(shù)列表的小括弧可以省略:x -> { System.out.println(x); }

● 參數(shù)列表中參數(shù)的數(shù)據(jù)類型可以省略:( x,y ) -> {x.compareTo(y);}

● 如果Lambda體只有一條語句,大括弧也可以省略:x -> { return x + 2 ; }

● 如果Lambda體中只有一條return語句, return關(guān)鍵字可以省略:(x,y) -> x+y

以下表達(dá)式是有效的Lambda表達(dá)式

(String s ) -> s.length()
(Student stu) -> stu.getAge() > 18
(int x,  int y ) -> {
     System.out.print(“result”);
     System.out.println( x + y );
}
() -> {}
() -> “hehe”
(String s)  -> { “wkcto” } 		//不合法
(String s)  -> {  return “wkcto” ; } 	
(String s)  ->  “wkcto” 	

Lambda使用案例:

布爾表達(dá)式, 判斷參數(shù)接收的list集合是否為空

(List list) -> list.isEmpty()

創(chuàng)建對象,并返回

() -> new Student()

消費(fèi)(使用)一個對象, 把參數(shù)接收學(xué)生對象的姓名打印出來

(Student stu ) -> { System.out.println( stu.name) ; }

從一個對象中選擇, 返回參數(shù)對象的成績

(Student stu) -> stu.getScore()

組合兩個值

(int a, int b) -> a*b

比較兩個對象

(Student stu1, Student stu2) -> stu1.getScore() - stu2.getScore()

Lambda函數(shù)式接口

在JDK8中, 引用了函數(shù)式接口. 就是只定義一個抽象方法的接口.如:Comparator接口 , Runnable接口

@FunctionalInterface //注解,聲明接口為函數(shù)式接口

public  interface  Adder{
   int add(int x, int y);
}

public  interface  ByteAdder extends Adder{
   byte add( byte b1, byte b2);
}

當(dāng)前ByteAdder接口不是函數(shù)式接口, 從Adder接口中繼承了一個抽象方法,在本接口中又定義了一個抽象方法

public  inteface  Nothing{
}

當(dāng)前Nothing接口也不函數(shù)式接口,因?yàn)闆]有抽象方法

函數(shù)式接口就是為Lambda表達(dá)式準(zhǔn)備的,或者說Lambda表達(dá)式必須實(shí)現(xiàn)一個函數(shù)式接口

java.util.function包中定義了一些基本的函數(shù)式接口,如Predicate, Consumer, Function,Supplier等

1、Predicate

Predicate接口中定義一個抽象方法test(T ),接收一個T類型的對象參數(shù),返回一個布爾值

當(dāng)需要一個涉及類型T的布爾表達(dá)式時,可以使用這個接口

public class Test01 {
    public static void main(String[] args) {
        List list = Arrays.asList("lisi", "zhangsan", "wangwu", "chenqi", "feifei");

        List  result = filter(list, x -> x.length() > 6);
        System.out.println(result);
    }
    //定義方法, 方法可以把List列表中符合條件的元素存儲到一個新的List列表中返回
    public  static  List filter(List list, Predicate predicate){
        List  result = new ArrayList<>();
        //遍歷list參數(shù)列表,把符合predicate條件的元素存儲到result中
        for( T  t : list){
            if( predicate.test(t)){
                result.add(t);
            }
        }
        return result;
    }

}

2、Consumer接口

Consumer接口定義了一個accept(T)抽象方法,可以接收一個T類型的對象,沒有返回值. 如果需要訪問類型T的對象,對該對象做一些操作,就可以使用這個接口. 在Collection集合和Map集合中都有forEach(Consumer)方法

public class Test02Consumer {
    public static void main(String[] args) {
        List list =Arrays.asList("lisi", "gg", "jj", "tuantuan", "daimeir", "timo","XDD");
        list.forEach(s -> System.out.println(s) );

        Map map = new HashMap<>();
        map.put("lisi", 22);
        map.put("feifei", 28);
        map.put("zhangxiaosan", 20);
        map.put("chenqi", 30);
        map.forEach((k,v)-> System.out.println(k + "->" + v) );

    }
}

3、Function接口

Function接口中定義了accept( T )方法,接收一個T類型的參數(shù)對象,返回一個R類型的數(shù)據(jù). 如果需要定義一個Lambda,將一個輸入對象的信息加工后映射到輸出,就可以使用該接口

public class Test03Function {
    public static void main(String[] args) {
        List list = Arrays.asList("lisi", "gg", "jj", "tuantuan", "daimeir", "timo","XDD");

        //把list集合中存儲字符串的長度映射出來
        List  result = map(list, x->x.length() );
        System.out.println(result);

    }
    //把一個List列表映射到另外一個List列表中
    public static List  map(List list, Function function){
        List result = new ArrayList<>();         //存儲映射后的數(shù)據(jù)
        for( T t : list){
            result.add( function.apply(t) );        //把a(bǔ)pply對t對象的操作結(jié)果保存到result集合中
        }
        return  result;
    }
}

4、原始類型的處理

泛型只能綁定引用類型,不能使用基本類型。

Java8中函數(shù)式接口為基本類型也提供了對應(yīng)的接口,可以避免在進(jìn)行輸入輸出原始數(shù)據(jù)時頻繁進(jìn)行裝箱/拆箱操作。

一般來說,在針對專門的基本類型數(shù)據(jù)的函數(shù)式接口名稱前面加上了對應(yīng)的原始類型前綴,如: IntPredicate, IntConsumer, IntFunction等。

IntPredicate evenNumbers = (int x ) -> x % 2 == 0 ;

evenNumbers.test( 10 ); //返回true

evenNumbers.test( 11 ); //返回false

Lambda表達(dá)式捕獲

Lambda表達(dá)式可以使用外層作用域中定義的變量,如成員變量,局部變量,稱為捕獲Lambda。

package com.wkcto.lambda;

import java.util.function.IntUnaryOperator;

/**
 * author: 動力節(jié)點(diǎn)老崔
 * 2019/3/13
 */
public class Test04LambdaVariable {
    int xx = 123;       //實(shí)例變量
    static  int yy = 456;       //靜態(tài)變量

    public static void main(String[] args) {

        //在Lambda表達(dá)式中使用成員變量,當(dāng)前main方法是靜態(tài)方法,只能使用靜態(tài)變量
        IntUnaryOperator operator = i ->{
            return  i + yy;         //把參數(shù)接收的數(shù)據(jù)與靜態(tài)變量的值相加并返回
        };
        System.out.println( operator.applyAsInt(10));

        //在Lambda表達(dá)式中使用局部變量,局部變量必須是final修飾,或者是事實(shí)上的final
        int zz = 789;       //局部變量
        final  int ff = 147;    //final修飾的局部變量
        IntUnaryOperator operator2 = i->{
            return  i + ff;    //把參數(shù)接收的數(shù)據(jù)與ff的值相加,然后返回
        };
        System.out.println(operator2.applyAsInt(10));

        operator2 = i ->{
            return  i + zz; //zz雖然沒有使用final修飾,如果它是事實(shí)的final,后面沒有修改zz值的代碼
        };
        System.out.println( operator2.applyAsInt(10));
//        zz = 258;     //如果再對zz重新賦值,則上面的lambda表達(dá)式語法錯誤

    }
}

 

全部教程
主站蜘蛛池模板: 色网站在线观看 | 91亚洲精品一区二区福利 | 夜间福利视频 | 最新99国产成人精品视频免费 | 成年黄页免费大全网站 | 国产成人精品午夜二三区 | 四虎永久在线精品国产馆v视影院 | 亚洲综合网站 | 久久青草91免费观看 | 国产欧美精品一区二区三区四区 | 天天舔天天射天天干 | 日本老年人精品久久中文字幕 | 国产高清美女一级毛片久久 | 成人小视频在线播放 | 四虎永久视频 | 天天操女人 | 99热久久这里只有精品2010 | 四虎影视库永久在线地址 | 综合色桃花久久亚洲 | 亚洲不卡在线观看 | 美欧毛片 | 日本aa在线观看 | 亚洲免费观看视频 | 亚洲情区| 久久草在线视频观看 | 国产精品久久大陆 | 婷婷色在线播放 | 国产精品久久成人影院 | 欧美一区中文字幕 | 国内国产精品天干天干 | 成年女人aaaaa毛片 | 男人天堂视频在线观看 | 小明看看成人免费 | 日韩不卡一级毛片免费 | 青草视频在线观看视频 | 国产网红自拍 | 色综合久久久久久久久五月 | 国产精品免费观看 | 在线视频精品一区 | 成人免费观看一区二区 | 国产女人水多毛片18 |