Java8中函數(shù)式接口與Lambda表達(dá)式的特性-創(chuàng)新互聯(lián)

今天就跟大家聊聊有關(guān)Java8中函數(shù)式接口與Lambda表達(dá)式的特性,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)新互聯(lián)公司從2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站建設(shè)、成都做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元衡南做網(wǎng)站,已為上家服務(wù),為衡南各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220

什么是Lambda表達(dá)式,java8為什么使用Lambda表達(dá)式?

“Lambda 表達(dá)式”(lambda expression)是一個(gè)匿名函數(shù),Lambda表達(dá)式基于數(shù)學(xué)中的λ演算得名,直接對(duì)應(yīng)于其中的lambda抽象(lambda abstraction),是一個(gè)匿名函數(shù),即沒(méi)有函數(shù)名的函數(shù)。我們可以把 Lambda表達(dá)式理解為是 一段可以傳遞的代碼。最直觀的是使用Lambda表達(dá)式之后不用再寫大量的匿名內(nèi)部類,簡(jiǎn)化代碼,提高了代碼的可讀性。

  // 啟動(dòng)一個(gè)線程,不使用Lambda表達(dá)式
  new Thread(new Runnable() {
    @Override
    public void run() {
      System.out.println("啟動(dòng)一個(gè)線程");
    }
  }).start();
  //使用Lambda表達(dá)式,只需要一行代碼
  new Thread(() -> System.out.println("啟動(dòng)一個(gè)線程")).start();

Lambda表達(dá)式的基本語(yǔ)法和格式

基本語(yǔ)法

  • java8中引入了新的操作符”->”,稱為箭頭操作符或者lambda操作符,箭頭操作符將lambda拆分為兩部分,左側(cè):lambda表達(dá)式的參數(shù)列表,右側(cè):lambda表達(dá)式中的所需要執(zhí)行的的功能(接口實(shí)現(xiàn)的功能代碼)。

  • lambda表達(dá)式需要“函數(shù)式接口”的支持,接口中只有一個(gè)抽象方法的接口稱為函數(shù)式接口,可以使用注解@FunctionalInterface檢查接口是否是函數(shù)式接口。

  • lambda表達(dá)式的參數(shù)列表的數(shù)據(jù)類型可以省略不寫,因?yàn)閖vm編輯器可以通過(guò)上下文判斷。

  • 基本格式

① 無(wú)參數(shù),無(wú)返回值。( ) -> System.out.println(“hello”)

  // 實(shí)現(xiàn)Runnable接口(無(wú)參,無(wú)返回)
  Runnable r = () -> System.out.println("hello lambda");

② 一個(gè)參數(shù)(小括號(hào)可以省略不寫,習(xí)慣上加上小括號(hào)),無(wú)返回值。(x) -> System.out.println(x)

  //Consumer接口(一個(gè)參數(shù),無(wú)返回值),之后會(huì)提到
  //第一種,小括號(hào)不省略
  Consumer<String> c = (x) -> System.out.print(x);
  c.accept("hello");
  //小括號(hào)省略
  Consumer<String> c1 = x -> System.out.print(x);
  c1.accept("hello")

③ 有多個(gè)參數(shù),并且lambda有多條語(yǔ)句,則lambda語(yǔ)句必須用大括號(hào)括起來(lái)并有return返回(若有一條語(yǔ)句則可以省略大括號(hào)和return),有返回值。(x,y) ->{System.out.println(“hello”);return Integer.compare(x, y);};

//Comparator接口
  //多條語(yǔ)句
  Comparator<Integer> comparator = (x,y) ->{
    System.out.println("hello");
    return Integer.compare(x, y);
  };
  //一條語(yǔ)句
  Comparator<Integer> comparator2 = (x,y) -> Integer.compare(x, y);
  System.out.println(comparator2.compare(23, 22));

還有其他的一些格式都是大同小異,這里就不再了解。

函數(shù)式接口是什么?

在前面也提到了函數(shù)接口,那么函數(shù)接口到底是什么呢?是個(gè)接口,只包含一個(gè)抽象方法,那么它就是函數(shù)式接口,我們可以在任意函數(shù)式接口上使用 @FunctionalInterface 檢查它是否是一個(gè)函數(shù)式接口。
函數(shù)式接口里是可以包含默認(rèn)方法、靜態(tài)方法,他們不是抽象方法;也可以包含Java.lang.Object里的public方法,因?yàn)槿魏我粋€(gè)類都繼承Object類,包含了來(lái)自java.lang.Object里對(duì)這些抽象方法的實(shí)現(xiàn),也不屬于抽象方法;函數(shù)式接口里允許子接口繼承多個(gè)父接口,但每個(gè)父接口中都只能存在一個(gè)抽象方法,且必須的相同的抽象方法。

Java8內(nèi)置函數(shù)式接口

四大核心函數(shù)式接口

函數(shù)式接口方法參數(shù)類型返回類型作用
Consumer<T> 消費(fèi)型接口void accept(T t)Tvoid對(duì)T類型的參數(shù)進(jìn)行操作
Supplier<T> 供給型接口T get()無(wú)T操作數(shù)據(jù),返回T類型的結(jié)果
Function<T, R> 函數(shù)型接口R apply(T t)TR對(duì)T類型參數(shù)進(jìn)行操作,并返回R類型的結(jié)果
Predicate<T> 斷定型接口boolean test(T t)Tboolean確定T類型參數(shù)是否滿足某約束,并返回boolean值
//Consumer<T> 消費(fèi)型接口
  @Test
  public void test1(){
    Consumer<String> c = (x) -> System.out.println("hello:"+x+"!");
    c.accept("Java");
  }
  // Supplier<T> 供給型接口
  @Test
  public void test2(){
    Supplier<String> s = () -> "hello,beautiful girl";
    String str = s.get();
    System.out.println(str);
  }
  //Function<T,R> 函數(shù)性接口
  @Test
  public void test3(){
    Function<String, Integer> f= (x) -> x.length();
    Integer len = f.apply("hello");
    System.out.println(len);
  }
  //Predicate<T> 斷言型接口
  @Test
  public void test4(){
    Predicate<String> p = (x) -> x.length()>5;
    boolean b = p.test("hello Java");
    System.out.println(b);
  }

其它函數(shù)式接口

函數(shù)式接口方法參數(shù)類型返回類型作用
BiFunction<T , U, R >R apply(T t, U u)T, UR對(duì) T, U 類型的參數(shù)進(jìn)行操作,并返回R類型的結(jié)果
UnaryOperator<T> (Function 子接口)T apply(T t)TT對(duì) T類型的參數(shù)進(jìn)行一元運(yùn)算,并返回R對(duì)象的結(jié)果
BinaryOperato<T,R> (BiFunction 子接口) )T apply(T t1, T t2T, TT對(duì)T類型的參數(shù)進(jìn)行二元運(yùn)算,并返回T類型的結(jié)果
BiConsumer<T, U>void accept(T t, U u)T, Uvoid對(duì)T,作
ToIntToIntFunction<T> ToLongFunction<T> ToDoubleFunction<T&gtint(long,double) applyAsInt(T value)Tint, long, double計(jì) 算 int 、 long 、double值的函數(shù)
IntFunction<R> LongFunction<R> DoubleFunction<R>R apply(int(long,double) value)int, long, doubleR參數(shù)分別為int、long、double 類型的函數(shù)

看完上述內(nèi)容,你們對(duì)Java8中函數(shù)式接口與Lambda表達(dá)式的特性有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

網(wǎng)頁(yè)名稱:Java8中函數(shù)式接口與Lambda表達(dá)式的特性-創(chuàng)新互聯(lián)
轉(zhuǎn)載源于:http://muchs.cn/article12/cdcjgc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷型網(wǎng)站建設(shè)、建站公司網(wǎng)站內(nèi)鏈、網(wǎng)站收錄網(wǎng)站建設(shè)、域名注冊(cè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)