函數(shù)式接口

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

(1)、只包含一個抽象方法的接口,稱為函數(shù)式接口。

(2)、你可以通過Lambda表達式來創(chuàng)建該接口的對象。(若Lambda表達式拋出一個受檢異常,那么該異常需要在目標接口的抽象方法上進行聲明)。

(3)、我們可以在任意函數(shù)式接口上使用@FunctionalInterface注解,這樣做可以檢查它是否是一個函數(shù)式接口,同時javadoc也會包含一條聲明,說明這個接口是一個函數(shù)式接口。

二、自定義函數(shù)

示例代碼一:

@FunctionalInterface
public interface MyNumber{
    public double getValue();
}

示例代碼二:函數(shù)式接口中使用泛型

@FunctionalInterface
public interface MyFunc<T>{
    public  T  getValue(T t);
}

三、作為參數(shù)傳遞Lambda表達式

示例代碼:

public String strHandler(String str, MyFunction mf) {
        return mf.getValue(str);
    }
作為參數(shù)傳遞Lambda表達式:
String trimStr = strHandler("\t\t 你是大傻逼       ", (str) -> str.trim());
String upperStr = strHandler("abcdefg", (str) -> str.toUpperCase());
String newStr = strHandler("我大望江威武", (str) -> str.substring(2, 5));

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

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

在學習lambda表達式的時候,我們知道,要使用lambda表達式,我們就要創(chuàng)建一個函數(shù)式接口,那每次用lambda表達式的時候豈不是很麻煩,這時候,java給我們內(nèi)置了四大核心函數(shù)式接口。

1532143805119.png

當然,還有一些其他接口。

1532143859908.png

五、四大接口示例

1、 Consumer<T> : 消費型接口,void accept(T t);

代碼示例:

@Test
    public void test() {
        happy(10000,(m) -> System.out.println("大保健花了:"+m));
    }
    public void happy(double  money,Consumer<Double> con) {
        con.accept(money);
    }
2、 Supplier<T> : 供給型接口,T get();

示例代碼:

@Test
    public void test1() {
        List<Integer> numList = getNumList(10, ()->(int)(Math.random()*100 ));
        for (Integer integer : numList) {
            System.out.println(integer);
        }
    }
    
    
    //需求:產(chǎn)生指定個數(shù)的整數(shù),并放入集合中
    public List<Integer> getNumList(int num,Supplier<Integer> sup){
            List<Integer> list = new ArrayList<>();
            for(int i=0;i<num;i++) {
                
                Integer n = sup.get();
                list.add(n);
                
            }
            return list;
    }
3、Function<T, R> : 函數(shù)型接口,R apply(T t);

示例代碼:

@Test
    public void  test2() {
        String trimStr=strHandler("\t\t  你好,world!   ",(str) -> str.trim());
        System.out.println(trimStr);
        
        
        String sumString=strHandler("Helloworld!",(str)->str.substring(2, 4));
        System.out.println(sumString);
    }
    //需求:用于處理字符串
    public  String strHandler(String str,Function<String,String> fun) {
        return fun.apply(str);
    }
    
4、 Predicate<T> : 斷言型接口,boolean test(T t);

示例代碼:

    @Test
    public void test3() {
        List<String> list=Arrays.asList("Hello","world","hi","o","123");
        List<String> filterStr = filterStr(list, (str)->str.length()>1);
        for (String string : filterStr) {
            System.out.println(string);
        }
    }
    
    //需求:將滿足條件的字符串,放入集合中
        public List<String> filterStr(List<String> list, Predicate<String> pre){
            List<String> list2=new ArrayList<>();

            for (String str : list) {
                if(pre.test(str)){
                    list2.add(str);
                }
            }
            
            return list2;
        }
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容