java8 lambda表达式(二)——方法引用

当咱们在使用lambda去表示某个函数式接口的实例时,须要在lambda表达式的主体里去编写函数式接口抽象方法的实现,若是在现有的类中已经存在与抽象方法相似的方法了,咱们但愿直接引用现有的方法,而不用再去从新写实现了。方法引用让你能够重复使用现有的方法定义,并像Lambda同样传递它们。java

方法引用和lambda表达式拥有相同的特性,它们都须要表明一个目标类型,并须要被转化为函数式接口的实例,不过咱们并不须要为方法引用提供方法体,咱们能够直接经过方法名称引用已有方法方。方法引用要使用到操做符“::”,左边是类名或者对象名,右边是方法名或者关键字new数组

方法引用分类

首先被引用方法的返回值类型要和函数式接口抽象方法的返回值类型一致,至于参数列表要根据每种引用方式而定。app

静态方法引用

  • 引用语法:ClassName::staticMethodName
//Function<String, Long> f = x -> Long.valueOf(x);
Function<String, Long> f = Long::valueOf;
Long result = f.apply("10");

静态方法引用时,静态方法要与函数式接口抽象方法参数列表一致函数

类型的实例方法引用

  • 引用语法:ClassName::methodName
//BiPredicate<String, String> bpredicate = (x,y) -> x.equals(y);
BiPredicate<String, String> bpredicate = String::equals;
boolean result = bpredicate.test("abc", "abcd");

//ToIntFunction<String> f = (s) -> s.length();
ToIntFunction<String> f = String::length;
int result2 = f.applyAsInt("hello");

类型的实例方法引用时,函数式接口抽象方法的第一个参数是被引用方法的调用者,第二个参数(或者无参)是被引用方法的参数code

外部对象方法引用

  • 引用语法:objectName::methodName
List<String> list = Arrays.asList("hello", "world", "aaa");
//Predicate<String> p = (s) -> list.contains(s);
Predicate<String> p = list::contains; //list是lambda的一个外部对象
boolean result = p.test("aaa");

外部对象方法引用时,被引用方法与函数式接口抽象方法参数列表一致对象

构造器引用

  • 引用语法:ClassName::new
//Function<Long, Date> fun = (number) -> new Date(number);
Function<Long, Date> fun = Date::new;
Date date = fun.apply(1000000000000L);

构造器引用时,被引用的构造方法与函数式接口抽象方法参数列表一致接口

数组引用

  • 引用语法:Type[]::new
// Function<Integer, int[]> fun = n -> new int[n];
Function<Integer, int[]> fun = int[]::new;
int[] arr = fun.apply(10);

数组引用时,函数式接口抽象方法参数(数值型)即为数组初始化大小值io

相关文章
相关标签/搜索