• <strike id="6sogq"><s id="6sogq"></s></strike>
  • <strike id="6sogq"></strike>

    千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

    400-811-9990
    手機(jī)站
    千鋒教育

    千鋒學(xué)習(xí)站 | 隨時隨地免費學(xué)

    千鋒教育

    掃一掃進(jìn)入千鋒手機(jī)站

    領(lǐng)取全套視頻
    千鋒教育

    關(guān)注千鋒學(xué)習(xí)站小程序
    隨時隨地免費學(xué)習(xí)課程

    上海
    • 北京
    • 鄭州
    • 武漢
    • 成都
    • 西安
    • 沈陽
    • 廣州
    • 南京
    • 深圳
    • 大連
    • 青島
    • 杭州
    • 重慶

    你所不知道的Lambda表達(dá)式和常用的函數(shù)式接口

    匿名提問者 2023-03-27 15:22:00

    你所不知道的Lambda表達(dá)式和常用的函數(shù)式接口

    我要提問

    推薦答案

      同學(xué),您好!你所不知道的Lambda表達(dá)式和常用的函數(shù)式接口

    Lambda表達(dá)式

      一. 什么是Lambda表達(dá)式

      Lambda表達(dá)式是JDK1.8中新增的一種方式,用于替代匿名內(nèi)部類,該表達(dá)式可以讓開發(fā)人員更加關(guān)注于具體需要傳遞的方法,而不是因為需要傳遞一個方法而創(chuàng)建一個對象。

      二. Lambda表達(dá)式

      1. 基本語法

      Lambda省去?向?qū)ο蟮臈l條框框,格式由3個部分組成:

      參數(shù)部分

      箭頭

      代碼塊

      比如:(參數(shù)類型 參數(shù)名稱) -> { 代碼語句 }

      2. 格式說明

      ?括號內(nèi)的語法與傳統(tǒng)?法參數(shù)列表?致:?參數(shù)則留空;多個參數(shù)則?逗號分隔;

      -> 是新引?的語法格式,代表指向動作;

      ?括號內(nèi)的語法與傳統(tǒng)?法體要求基本?致。

      3. Lambda的省略格式

      所謂的Lambda表達(dá)式的省略原則是:可推導(dǎo)即可省略。

      Lambda強(qiáng)調(diào)的是“做什么”?不是“怎么做”,所以凡是可以根據(jù)上下?推導(dǎo)得知的信息,都可以省略。

      3.1 省略規(guī)則

      在Lambda標(biāo)準(zhǔn)格式的基礎(chǔ)上,使?省略寫法的規(guī)則為:

      ?括號內(nèi)參數(shù)的類型可以省略;

      如果?括號內(nèi)有且僅有?個參,則?括號可以省略;

      如果?括號內(nèi)有且僅有?個語句,則?論是否有返回值,都可以省略?括號、return關(guān)鍵字及語句、分號。

      4. Lambda的使用前提

      Lambda的語法?常簡潔,完全沒有?向?qū)ο髲?fù)雜的束縛,但是使?時有?個問題需要特別注意:

      使?Lambda必須具有接?,且要求接?中有且僅有?個抽象?法。 ?論是JDK內(nèi)置的

      Runnable 、 Comparator 接?還是?定義的接?,只有當(dāng)接?中的抽象?法存在且唯?時,才可以使用Lambda

      2. 使?Lambda必須具有上下?推斷。 也就是?法的參數(shù)或局部變量類型必須為Lambda對應(yīng)的接?

      類型,才能使?Lambda作為該接?的實例。

      5. 常用函數(shù)式接口

      JDK提供了?量常?的函數(shù)式接?以豐富Lambda的典型使?場景,它們主要在 java.util.function

      包中被提供. 常用的函數(shù)式接口包括以下四個。

      5.1 Supplier接?

      java.util.function.Supplier 接?僅包含?個?參的?法: T get() 。?來獲取?個泛型參數(shù),可以指定類型的對象數(shù)據(jù)。由于這是?個函數(shù)式接?,這也就意味著對應(yīng)的Lambda表達(dá)式需要“對外提供”?個符合泛型類型的對象數(shù)據(jù)。

      5.1.1 基本使用方式如下:

      public class SupplierDemo {

      // 為了獲取一個int類型的數(shù)據(jù)

      private static int getNum(Supplier supplier) {

      // get方法 -- 返回一個指定數(shù)據(jù)類型 T 的數(shù)據(jù)

      return supplier.get();

      }

      public static void main(String[] args) {

      // int num = getNum(new Supplier() {

      // @Override

      // public Integer get() {

      // return 50;

      // }

      // });

      System.out.println(getNum(() -> 50));

      // 1. 獲取30 60 兩個數(shù)字中的最大值

      // getNum(new Supplier() {

      // @Override

      // public Integer get() {

      // return Math.max(30, 60);

      // }

      // });

      getNum(()->Math.max(30, 60));

      // 有一個數(shù)組

      int[] nums = {1,5,4,8,4,51,2,1,6,8};

      // 通過getNum方法獲取數(shù)組的最大值

      // getNum(new Supplier() {

      // @Override

      // public Integer get() {

      // Arrays.sort(nums);

      // return nums[nums.length - 1];

      // }

      // });

      int num = getNum(() -> {

      Arrays.sort(nums);

      return nums[nums.length - 1];

      });

      System.out.println(num);

      }

      }

      5.2 Consumer接?

      java.util.function.Consumer 接?則正好與Supplier接?相反,它不是?產(chǎn)?個數(shù)據(jù),?是消費?個數(shù)據(jù),其數(shù)據(jù)類型由泛型決定。

      Consumer 接?中包含抽象?法 void accept(T t) ,意思是說消費?個執(zhí)?泛型的數(shù)據(jù)

      Consumer 接?中包含默認(rèn)?法:andThen

      如果?個?法的參數(shù)和返回值全都是 Consumer 類型,那么就可以實現(xiàn)效果:消費數(shù)據(jù)的時候,?先做?個操作, 然后再做另?個操作,實現(xiàn)組合。?這個?法就是 Consumer 接?中的default?法 andThen

      5.2.1 下?是JDK的源代碼:

      default Consumer andThen(Consumer after) {

      Objects.requireNonNull(after);

      return (T t) -> { accept(t); after.accept(t); };

      }

      基本使用方式如下:

      public class ConsumerDemo {

      // 使用一個指定的String類型的數(shù)據(jù)

      private static void useString(Consumer consumer, String string){

      consumer.accept(string);

      }

      private static void useString(Consumer consumer, Supplier supplier) {

      consumer.accept(supplier.get());

      }

      // 返回的Consumer對象的目的 -- 使用accept方法接收參數(shù),傳遞給first和second使用

      private static Consumer andThen(Consumer first, Consumer second){

      return new Consumer() {

      @Override

      public void accept(String s) {

      first.accept(s);

      second.accept(s);

      }

      };

      }

      private static void andThenTest(Consumer first, Consumer second, String string){

      // Consumer then = first.andThen(second);

      // then.accept(string);

      // 前后兩個接口對象之間,沒有數(shù)據(jù)上的聯(lián)系

      // 兩個接口 分別處理的都是原本的數(shù)據(jù)

      first.andThen(second).accept(string);

      System.out.println("---------");

      Consumer consumer = andThen(first, second);

      consumer.accept(string);

      }

      public static void main(String[] args) {

      // useString(new Consumer() {

      // @Override

      // public void accept(String s) {

      // System.out.println(s.length());

      // }

      // }, "lambda");

      // useString((String s)->{

      // System.out.println(s.length());

      // }, "lambda");

      useString(s->System.out.println(s.length()), "lambda");

      // useString(s-> System.out.println(s), "lambda");

      // useString(System.out::println, "lambda");

      useString(s-> {

      System.out.println(s.concat(Integer.valueOf(s.length()).toString()));

      System.out.println(s + s.length());

      }, "lambda");

      useString(s->{

      System.out.println(s.length());

      },()->{

      return "123456oiuytr";

      });

      andThenTest(s -> System.out.println(s.toUpperCase()),

      s->System.out.println(s.substring(0, 3)), "lambda Exp");

      }

      }

      5.3 Predicate接?

      有時候我們需要對某種類型的數(shù)據(jù)進(jìn)?判斷,從?得到?個boolean值結(jié)果。這時可以使

      ?java.util.function.Predicate接?。

      Predicate 接?中包含?個抽象?法: boolean test(T t)

      該接口也存在三個默認(rèn)的方法,分別是and 、 or 和negate, 分別表示與 、或 、非三種邏輯處理。

      5.3.1 接口代碼示例:

      public class PredicateDemo {

      private static boolean testMethod(Predicate predicate, String s){

      // test方法返回一個boolean類型的數(shù)據(jù)

      return predicate.test(s);

      }

      private static boolean andMethod(Predicate first, Predicate second, String s){

      return first.and(second).test(s);

      }

      private static boolean orMethod(Predicate first, Predicate second, String s) {

      return first.or(second).test(s);

      }

      private static boolean negateMethod(Predicate predicate, String s) {

      return predicate.negate().test(s);

      }

      public static void main(String[] args) {

      // 1. 判斷一個字符串是否是由txt結(jié)尾的

      // boolean result = testMethod(new Predicate() {

      // @Override

      // public boolean test(String s) {

      // return s.endsWith("txt");

      // }

      // }, "newFile");

      // boolean result = testMethod((String s)->{

      // return s.endsWith("txt");

      // }, "newFile");

      boolean result = testMethod(s->s.endsWith("txt"), "newFile");

      System.out.println(result);

      boolean r1 = andMethod(s -> s.length() > 6,

      s -> s.startsWith("a"), "asijhgvbnm");

      boolean r2 = orMethod(s -> s.length() > 6,

      s -> s.equals("abcd"), "asdfghjkl");

      boolean r3 = negateMethod(s -> s.endsWith("a"), "asdfghjkl");

      System.out.println(r1 + " - " + r2 + " - " + r3);

      }

      }

      5.4 Function接?

      java.util.function.Function接??來根據(jù)?個類型的數(shù)據(jù)得到另?個類型的數(shù)據(jù),前者稱為前置條件,后者稱為后置條件。

      Function 接?中最主要的抽象?法是: R apply(T t) ,根據(jù)類型T的參數(shù)獲取類型R的結(jié)果。

      Function接?中有?個默認(rèn)的andThen?法,?來進(jìn)?組合操作。

      5.4.1 基本使用方式如下

      public class FunctionDemo {

      private static void applyMethod(Function function, String s){

      Integer apply = function.apply(s);

      System.out.println("從字符串" + s + "中獲取的integer類型數(shù)據(jù)是:" + apply);

      }

      private static Function andThen(Function first, Function second){

      // T = String; R = Integer; V=Boolean

      // String --> Boolean

      return new Function() {

      @Override

      public Boolean apply(String s) {

      // String --> Integer

      Integer apply = first.apply(s);

      // Integer --> Boolean

      Boolean apply1 = second.apply(apply);

      return apply1;

      }

      };

      }

      private static void andThenMethod(Function first, Function second, String s){

      Function then = first.andThen(second);

      // 因為andThen方法在實現(xiàn)的時候 前面一個的結(jié)果給后面一個處理

      // 前者T R --> 后者 R V ==> T --> V

      Boolean apply = then.apply(s);

      System.out.println(apply);

      System.out.println("------");

      Function function = andThen(first, second);

      Boolean b = function.apply(s);

      System.out.println(b);

      }

      public static void main(String[] args) {

      // applyMethod(new Function() {

      // @Override

      // public Integer apply(String s) {

      // return s.indexOf("a");

      // }

      // }, "fashjkl");

      // applyMethod((String s)->{

      // return s.indexOf("a");

      // }, "fashjkl");

      applyMethod(s->s.indexOf("a"), "fashjkl");

      andThenMethod(s-> s.length(),

      i -> i > 20, "sadfghjkl;");

      // andThenMethod(String::length,

      // i -> i > 20, "sadfghjkl;");

      }

      }

      現(xiàn)在你學(xué)會Lambda表達(dá)式怎么用了嗎?

    猜你喜歡LIKE

    Css3有哪些新特性

    2023-03-27

    Vue開發(fā)相對于原生的js開發(fā)有什么優(yōu)點

    2023-03-27

    為什么不能用break?

    2023-03-27

    最新文章NEW

    Vue3.0和Vue2.0的區(qū)別

    2023-03-27

    什么是權(quán)限管理?權(quán)限管理有哪些分類

    2023-03-27

    在成都參加java程序員培訓(xùn)班要多少錢?

    2023-03-27