JAVA学习笔记21 函数式接口

函数式接口概述

函数式接口:有且仅有一个抽象方法的接口(但可以有别的default方法)
Java中的函数式编程体现就是Lambda表达式,所以函数式接[就是可以适用于Lambda使用的接口
只有确保接口中有且仅有一个抽象方法, Java中的ambda才能顺利地进行推导

在这里插入图片描述
栗子1:
MyInterface接口:

package FunctionInterface.Demo01;
@FunctionalInterface
public interface MyInterface {
    void show();
}

@FunctionalInterface注解,用于限制这个接口里只有一个方法,这样他就一定可以作为一个函数接口了(必须有且只有一个方法),如果没有这个注解也是可以的,但是为了确保他只有一个方法,还是用比较好,因为如果不满足的话会报错。

MyInterfaceDemo:

package FunctionInterface.Demo01;

import javax.sound.midi.Soundbank;

public class MyInterfaceDemo {
    public static void main(String[] args) {
        MyInterface my=()-> System.out.println("函数式接口");
        my.show();

    }
}

函数式接口,可以理解为 ()为某个接口,由于前面是MyInterface所以这里()指的就是MyInterface接口,没有参数,需要执行的内容为System.out.println(“函数式接口”),也就是将MyInterface接口中唯一的那个方法(也就是show()),重写为了System.out.println(“函数式接口”)然后再调用这个重写的方法my.show()。

函数式接口作为方法的参数

package FunctionInterface.Demo01.RunnableDemo;

public class RunnableDemo {
    public static void main(String[] args) {
        //调用startThread方法

        //匿名内部类
        startThread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"线程启动了");
            }
        });

        //函数式接口
        startThread(()->{
            System.out.println(Thread.currentThread().getName()+"线程启动了");
        });
    }

    private static void startThread(Runnable r){
//        Thread t=new Thread(r);
//        t.start();
        new Thread(r).start();

    }
}

其实就是之前我们学lambda表达式的一个Demo一个意思,只是这里强调的是把lambda作为参数,也就是()作为接口以及参数。

函数式接作为方法的返回值

在这里插入图片描述

package FunctionInterface.Demo01.ReturnDemo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class ReturnDemo {
    public static void main(String[] args) {
        //构造使用场景
        ArrayList<String> arrayList=new ArrayList<String>();

        arrayList.add("cccc");
        arrayList.add("aa");
        arrayList.add("b");
        arrayList.add("ddd");

        Collections.sort(arrayList,getComparetor());
        System.out.println(arrayList);
    }
    //这是一个方法,用于得到一个Comparator,这个Comparator是定义一种排序方式的,这里定义的排序方式为哪个String的length长哪个就在后面
    private static Comparator<String> getComparetor(){
        //使用匿名内部类
        return new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.length()-o2.length();
            }
        };
    }
}

这里先是用的匿名内部类的方式获取这个comparato r比较器,我们可以使用lambda表达式代替这个匿名内部类,以获取比较器comparator。

package FunctionInterface.Demo01.ReturnDemo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class ReturnDemo {
    public static void main(String[] args) {
        //构造使用场景
        ArrayList<String> arrayList=new ArrayList<String>();

        arrayList.add("cccc");
        arrayList.add("aa");
        arrayList.add("b");
        arrayList.add("ddd");

        Collections.sort(arrayList,getComparetor());
        System.out.println(arrayList);
    }
    //这是一个方法,用于得到一个Comparator,这个Comparator是定义一种排序方式的,这里定义的排序方式为哪个String的length长哪个就在后面
    private static Comparator<String> getComparetor(){
        return (String s1,String s2)->{
            return s1.length()-s2.length();
        };
        //Comparator是一个函数式接口(有函数式接口的注解,只有一个方法)
        //这个方法要求返回值必须是Comparator,所以这里使用lambda表达式肯定是重写并执行了Comparator中唯一的那个方法
        //String s1,String s2为接口需要的参数,{return s1.length()-s2.length();}为重写并执行的内容。
    }
}

Comparator是一个函数式接口(有函数式接口的注解,只有一个方法)。
这个方法要求返回值必须是Comparator,所以这里使用lambda表达式肯定是重写并执行了Comparator中唯一的那个方法。
String s1,String s2为接口需要的参数,{return s1.length()-s2.length();}为重写并执行的内容。
在这里插入图片描述

常用函数式接口之Supplier

在这里插入图片描述

package FunctionInterface.Demo01.SupplierDemo;

import java.util.function.Supplier;

public class SuppllierDemo {
    public static void main(String[] args) {
        //匿名内部类
        String s1=getString(new Supplier<String>() {
            @Override
            public String get() {
                return "zbz";
            }
        });
        System.out.println(s1);
        
        //Supplier是一个函数式接口,所以可以使用lambda方式
        String s=getString(()->{
            return "林青霞";
        });
        System.out.println(s);
    }
    
    //定义一个方法,返回一个字符串数据
    private static String getString(Supplier<String> sup){
        return sup.get();
    }
}

在这里插入图片描述

package FunctionInterface.Demo01.SupplierDemo;

import java.util.function.Supplier;

public class SupplierMaxDemo {
    public static void main(String[] args) {
        int[] arr = {12, 33, 44, 11};

        int maxValue = getMax(() -> {
            int max = arr[0];

            for (int i = 0; i < arr.length; i++) {
                if (arr[i] > max) {
                    max = arr[i];
                }
            }

            return max;
        });

        System.out.println(maxValue);
    }

    //返回一个int数组的最大值
    private static int getMax(Supplier<Integer> sup) {
        return sup.get();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值