JDK8函数式接口

JDK8新特性函数式接口

  • 函数式接口
    • Jdk8中提供了很多函数式接口其中列举了4中常用的函数式接口
    • Lambda表达式
    • Predicate
    • Predicate代码实例
    • Consumer
    • Consumer代码实例
    • Function
    • Function代码实例
    • 方法引用
    • 语法糖
    • Supplier
    • Supplier 代码实例
    • 总结

函数式接口

顾名思义,它是一个接口,有且只有一个抽象方法,需要注意的是接口的默认方法和静态方法并不影响一个接口成为函数式接口。

Jdk8中提供了很多函数式接口其中列举了4中常用的函数式接口

 接口	       参数	  返回类型	        描述
 Predicate	T	      boolean	           用于判别一个对象。比如求一个人是否为男性
 Consumer  T	     void	               用于接收一个对象进行处理但没有返回,比如接收一个人并打印他的名字
 Function	    T	      R	                   转换一个对象为不同类型的对象
 Supplier	   None  T	                   提供一个对象

Lambda表达式

lamdba表达式,()->{}; 如果没有参数可以在()不写,有参数要写,可以不用写参数类型,如果该参数需要被final等修饰符修饰需要加上参数类型。下面是使用方法
players.forEach((player) -> System.out.print(player + "; "));

Predicate

Predicate是一个函数式接口,它主要用来进行对比,进行比较两个值的不同或者对象中的值是否是给定的值,返回值为boolean类型
下面是一个实例

Predicate代码实例

编写一个getSex方法 传入参数 sex 和Predicate接口
private static boolean getSex(char sex,Predicate pre){ return pre.test(sex); }
在main方法中进行实现

 //判断是否为男
        getSex('男',(sex)->{
            if (sex=='男'){
                System.out.println("他是男的");
                return true;
            }
            return false;
        });

Consumer

Consumer 函数式接口,主要是用来消费一个对象,或者数据 返回值是void。这样理解起来非常麻烦,我们可以通过下面的代码实例来看一下。

Consumer代码实例

编写一个getName方法 传入参数 name 和Consumer接口

private static void getName(String name, Consumer con){
        con.accept(name);
    }

在main方法中进行实现

getName("mcshangyun",(name)->{
            System.out.println(name);
        });

Function

主要是用来转换对象的类型,返回任意的数据类型。

Function代码实例

编写一个getInt方法 传入参数String类型的 id 和Function接口

private static int getInt(Function function,String id){
        return function.apply(id);
    }

在main方法中进行实现

getInt(Integer::parseInt,"654321");

在这里是不是发现没有看懂getInt的方法是怎么实现的 ,它使用的是方法引用的方式 下面我们介绍下方法的引用

方法引用

方法引用得简介:
方法引用与构造器引用
方法引用
当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!
方法引用就是Lambda表达式,就是函数式接口的一个实例,通过方法的名字来指向一个方法,可以认为是Lambda表达式的一个语法糖。
要求:实现抽象方法的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致!
方法引用:使用操作符 “::” 将类(或对象) 与 方法名分隔开来。
如下三种主要使用情况: 对象::实例方法名
类::静态方法名
类::实例方法名
实现抽象方法的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致" 这句话很重要,一定要理解
我的理解是:
举个例子
Comparator comparator = (x,y)->Integer.compare(x, y);等同于
Comparator comparator1 = Integer::compare;
即:方法引用的方法是Integer的compare吧,他的参数列表是两个integer类型,返回值是int
方法引用的前提是:
方法引用得前提是

  •      1.对象已经存在     2.类是存在得          3.super是存在的      4.this是存在               5.构造器是存在的   6 数组的创建语法
    
  •      1.方法已经存在     2.静态方法也是存在的   3.父类的方法是存在的  4.本类中的方法也是存在的     5.创建对象 new
    
  •      1.对象::方法名     2.Math::abs           3.super::方法名称    4.this::方法名称            5.类名::new       6 int [] ::new
    

其中又引出一个关键词 语法糖

语法糖

“语法糖”这个词绝非贬义词,它可以给我们带来方便,是一种便捷的写法,编译器会帮我们做转换;而且可以提高开发编码的效率,在性能上也不会带来损失。

Supplier

Supplier是用来创建对象的,但是不同于传统的创建对象语法:new 下面的方法有得用得是方法引用,利用supplier比较数组中的大小 使用的方式是lambda表达式

Supplier 代码实例

编写一个getMax方法Supplier接口

private static int getMax(Supplier supplier){
        return supplier.get();
    }

在main方法中进行实现

int [] arr ={100,-50,99,210,66,70};
        //这里使用的是lambda表达式   也只有函数式接口才能用 函数式接口:有且只有一个抽象方法
        int maxValue=getMax(()->{
            int max =arr[0];
            for (int i=1;i

总结

总的来说  函数式接口的主要体现在Stream流中,下篇文章会写一下Stream的应用。每天进步一点点,迎娶白富美
嘿嘿,当然这些都是不存在的,还是洗洗睡吧 

你可能感兴趣的:(成长之路,java,jdk8,新特性)