函數(shù)式接口

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

  • 只包含一個抽象方法的接口,稱為函數(shù)式接口匾南。
  • 你可以通過 Lambda 表達式來創(chuàng)建該接口的對象。(若 Lambda 表達式拋出一個受檢異常,那么該異常需要在目標接口的抽象方法上進行聲明)叽粹。
  • 我們可以在任意函數(shù)式接口上使用 @FunctionalInterface注解, 這樣做可以檢查它是否是一個函數(shù)式接口,同時 javadoc 也會包 含一條聲明虫几,說明這個接口是一個函數(shù)式接口锤灿。

自定義函數(shù)式接口

image.png
代碼
package com.www.java8.inter;

/**
 * 函數(shù)式接口
 * <p>
 *
 * @author Www
 * <p>
 * 郵箱: 483223455@qq.com
 * <p>
 * 創(chuàng)建時間: 2022/8/11  18:27  星期四
 * <p>
 */
@FunctionalInterface
public interface MyFun<T> {
    /**
     * 獲取傳入的參數(shù)
     *
     * @param t
     * @return
     */
    public Integer getValue(Integer t);
}

作為參數(shù)傳遞Lambda 表達式
image.png

作為參數(shù)傳遞 Lambda 表達式:為了將 Lambda 表達式作為參數(shù)傳遞,接 收Lambda 表達式的參數(shù)類型必須是與該 Lambda 表達式兼容的函數(shù)式接口 的類型辆脸。

Java 內(nèi)置四大核心函數(shù)式接口

image.png

其他接口

image.png

代碼演示

package com.www.java8.test;

import org.testng.annotations.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * Java8  內(nèi)置的四大核心函數(shù)式接口
 * <p>
 * Consumer<T> :消費型接口
 * void accept(T t);
 * <p>
 * Supplier<T> :供給型接口
 * T get();
 * <p>
 * Function<T, R> :函數(shù)型接口
 * R apply(T t);
 * <p>
 * Predicate<T> : 斷言型接口
 * <p>
 * boolean test(T t);
 *
 * @author Www
 * <p>
 * 郵箱: 483223455@qq.com
 * <p>
 * 創(chuàng)建時間: 2022/8/11  19:39  星期四
 * <p>
 */
public class Lambda2Test {
    
    /**
     * Consumer<T> 消費型接口 但校, 有去無回
     */
    @Test
    public void testConsumer() {
        happy(46919, m -> System.out.println("享受生活消費 " + m + "元"));
    }
    
    /**
     * Supplier<T> 供給型 接口
     */
    @Test
    public void testSupplier() {
        List<Integer> numbers = getNumbers(10, () -> (int) (Math.random() * 100));
        numbers.forEach(System.out::println);
        
    }
    
    /**
     * Function<T> 函數(shù)型接口
     */
    @Test
    public void testFunction() {
        String wfsdgfasdf = strHandle("\t\t\t\t\twfsdgfasdf             ", String::trim);
        System.out.println(wfsdgfasdf);
        String str = strHandle("\t\t\t\t\twfsdgfasdf 我愛中國sdf", s -> s.substring(s.length() - 7, s.length() - 3));
        System.out.println(str);
    }
    
    
    /**
     * Predicate<T> 斷言型接口
     */
    @Test
    public void testPredicate() {
        List<String> list = Arrays.asList("wefasf", "fasdf", "wsdf", "sdf", "sd", "fs");
        List<String> list1 = filterStr(list, s -> s.length() < 3);
        
        list1.forEach(System.out::println);
    }
    
    public List<String> filterStr(List<String> list, Predicate<String> predicate) {
        List<String> strings = new ArrayList<>();
        for (String string : list) {
            if (predicate.test(string)) {
                strings.add(string);
            }
        }
        return strings;
    }
    
    /**
     * 處理字符串
     *
     * @param str
     * @param fun
     * @return
     */
    public String strHandle(String str, Function<String, String> fun) {
        return fun.apply(str);
    }
    
    /**
     * 產(chǎn)生指定個數(shù)的整數(shù), 變更放入到集合中
     *
     * @param num
     * @param sup
     * @return
     */
    public List<Integer> getNumbers(int num, Supplier<Integer> sup) {
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < num; i++) {
            list.add(sup.get());
        }
        return list;
    }
    
    
    /**
     * 消費
     *
     * @param money
     * @param consumer
     */
    public void happy(double money, Consumer<Double> consumer) {
        consumer.accept(money);
    }
}

package com.www.java8.test;

import com.www.java8.entity.Employee;
import com.www.java8.inter.MyFunction;
import org.testng.annotations.Test;

import java.util.Arrays;
import java.util.List;

/**
 * 練習
 * <p>
 *
 * @author Www
 * <p>
 * 郵箱: 483223455@qq.com
 * <p>
 * 創(chuàng)建時間: 2022/8/11  18:42  星期四
 * <p>
 */
public class LambdaDemo {
    List<Employee> employees = Arrays.asList(
            new Employee("w", 21, 9999.99),
            new Employee("ww", 31, 6666.66),
            new Employee("nw", 31, 6666.66),
            new Employee("lw", 31, 6666.66),
            new Employee("www", 41, 777.66),
            new Employee("l", 1, 5555.555));
    
    /**
     * 先根據(jù) 年齡排序啡氢, 年齡一樣時 状囱,根據(jù) 姓名進行排序
     */
    @Test
    public void test1() {
        employees.sort((e1, e2) -> {
            if (e1.getAge().equals(e2.getAge())) {
                return e1.getName().compareTo(e2.getName());
            } else {
                return Integer.compare(e2.getAge(), e1.getAge());
            }
        });
        for (Employee emp : employees) {
            System.out.println(emp);
        }
    }
    
    /**
     * 處理
     */
    @Test
    public void test2() {
        System.out.println("去除空格:");
        String s = strHandler("\t\t\t 我愛中國", String::trim);
        System.out.println(s);
        
        System.out.println("將字母轉換成 大寫:");
        String sdfsdf = strHandler("sdfsdf", String::toUpperCase);
        System.out.println(sdfsdf);
        System.out.println("截取字符串:");
        System.out.println(strHandler("wsdfgasdf我愛中國", str -> str.substring(str.length() - 4)));
    
    }
    
    /**
     * 處理字符串
     *
     * @param str
     * @param fun
     * @return
     */
    public String strHandler(String str, MyFunction fun) {
        return fun.getValue(str);
    }
    
}

MyFunction

package com.www.java8.inter;

/**
 * <p>
 *
 * @author Www
 * <p>
 * 郵箱: 483223455@qq.com
 * <p>
 * 創(chuàng)建時間: 2022/8/11  18:50  星期四
 * <p>
 */
@FunctionalInterface
public interface MyFunction {
    /**
     * 將 str 返回
     *
     * @param str
     * @return
     */
    public String getValue(String str);
}

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市倘是,隨后出現(xiàn)的幾起案子亭枷,更是在濱河造成了極大的恐慌,老刑警劉巖搀崭,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叨粘,死亡現(xiàn)場離奇詭異,居然都是意外死亡瘤睹,警方通過查閱死者的電腦和手機升敲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來默蚌,“玉大人冻晤,你說我怎么就攤上這事〕裎” “怎么了鼻弧?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長锦茁。 經(jīng)常有香客問我攘轩,道長,這世上最難降的妖魔是什么码俩? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任度帮,我火速辦了婚禮,結果婚禮上稿存,老公的妹妹穿的比我還像新娘笨篷。我一直安慰自己,他們只是感情好瓣履,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布率翅。 她就那樣靜靜地躺著,像睡著了一般袖迎。 火紅的嫁衣襯著肌膚如雪冕臭。 梳的紋絲不亂的頭發(fā)上腺晾,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機與錄音辜贵,去河邊找鬼悯蝉。 笑死,一個胖子當著我的面吹牛托慨,可吹牛的內(nèi)容都是我干的鼻由。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼榴芳,長吁一口氣:“原來是場噩夢啊……” “哼嗡靡!你這毒婦竟也來了?” 一聲冷哼從身側響起窟感,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎歉井,沒想到半個月后柿祈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡哩至,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年躏嚎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片菩貌。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡卢佣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出箭阶,到底是詐尸還是另有隱情虚茶,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布仇参,位于F島的核電站嘹叫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏诈乒。R本人自食惡果不足惜罩扇,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望怕磨。 院中可真熱鬧喂饥,春花似錦、人聲如沸肠鲫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滩届。三九已至集侯,卻和暖如春被啼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背棠枉。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工浓体, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辈讶。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓命浴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親贱除。 傳聞我的和親對象是個殘疾皇子生闲,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容