导航

方法引用

Posted on 2019-02-25 13:00  TalkLessDoMore  阅读(1846)  评论(0编辑  收藏  举报

一、方法引用概述

  1.方法引用是lambda表达式一种简写的方式,回忆lambda表达式,它由接口申明和方法定义组成,而在方法引用中方法的定义已然让有符合接口定义的方法代替,不用重新定义方法。

  2.方法引用有四种基本方式:①Class::new:获取该实例对象;

                 ②Class::static_method:调用该class的静态方法;

                 ③Class::method:调用该class的任意方法;

                 ④instance::method:调用该实例的任意方法。

二、基本功能使用

 

 1 public class FunctionRefer {
 2     /*
 3      *内部接口定义 
 4      */
 5     interface FunctionOperator{
 6         int sum(int a ,int b);
 7     }
 8     
 9     /*
10      * 静态方法的引用或任意对象方法引用:Class::method
11      */
12     @Test
13     public void add(){
14         //lumbda表达式执行的过程
15         FunctionOperator functionOperator = (a,b)->a+b;
16         Consumer<String> consumer = System.out::println;
17         consumer.accept("lumbda执行结果:"+functionOperator.sum(1,2));
18         //函数引用过程,因为在Math中有个静态方法
19         FunctionOperator functionOperator1 = Math::addExact;
20         consumer.accept("lumbda执行结果:"+functionOperator1.sum(1,2));
21     }
22 
23     class FunctionReferImpl implements FunctionOperator{
24         @Override
25         public int sum(int a, int b) {
26             return a+b;
27         }
28     }
29 
30     /**
31      * 特定对象的引用
32      */
33     @Test
34     public void objectRefer(){
35         //supplier是jdk1.8的函数,这个函数定义是有一个返回值,无入参,与创建实例对象的构造函数方法定义相同可以接收
36         Supplier<FunctionOperator> fun = FunctionReferImpl::new;
37         FunctionOperator functionOperator = fun.get();
38         FunctionOperator functionOperator1 = functionOperator::sum;
39         Consumer<String> consumer = System.out::println;
40         consumer.accept("方法引用方式:"+functionOperator1.sum(1,2));
41     }
42 }

 

 

 

三、总结

1.在方法引用上面注意点:

 ①该引用的函数必定与定义的接口形参和返回值类型一致;

 ②调用静态方法和调用实例方法时使用的调用对象是不一样的,一个是Class,一个是instance;

 ③其实在方法引用上面还有许多函数式接口的引用(可以参考java.util.function)。

 ④常用function:Function:接受一个输入参数,返回一个结果;BiFunction:接受两个参数返回一个对象;Consumer:接受一个输入参数并且无返回操作,accept;Predicate:接受一个输入参数,返回一个布尔值结果

    Supplier:无参数,返回一个结果。