当我们使用lambda表达式去创建一个匿名方法时,有时我们并没有做什么事情,仅仅是使用了对象中一个存在的方法。这种情况下,通过对象的方法名就能够很明显的推断出要使用 的方法,java8中的方法引用能够做到这一点。

首先创建一个Person对象。

public classPerson {public enumSex {

MALE, FEMALE

}

String name;

LocalDate birthday;

Sex gender;

String emailAddress;public intgetAge() {//...

}publicCalendar getBirthday() {returnbirthday;

}public static intcompareByAge(Person a, Person b) {returna.birthday.compareTo(b.birthday);

}}

然后有一组person对象,想通过生日进行排序,那么传统的方法是,实现Comparator接口

Person[] rosterAsArray = roster.toArray(newPerson[roster.size()]);class PersonAgeComparator implements Comparator{public intcompare(Person a, Person b) {returna.getBirthday().compareTo(b.getBirthday());

}

}

Arrays.sort(rosterAsArray,newPersonAgeComparator());

调用的sort方法如下,传入数组和 实现了Comparator的对象

static void sort(T[] a, Comparator super T> c)

因为Comparator接口是一个函数式接口,所以可以用lambda表达式代替实现了Comparator接口的类对象。

Arrays.sort(rosterAsArray,

(Person a, Person b)->{returna.getBirthday().compareTo(b.getBirthday());

}

);

然而匿名方法是根据生日对Person进行排序,这种方法功能已经在Person类中存在,所以我们可以直接使用lambda表达式调用

Arrays.sort(rosterAsArray,

(a, b)->Person.compareByAge(a, b)

);

因为lambda表达式调用存在的方法,可以使用方法应用代替lambda表达式

Arrays.sort(rosterAsArray, Person::compareByAge);

参数列表从与引用方法参数一致,JRE能够推断出方法参数类型,是(Person, Person)

方法体是Person.compareByAge,这样提高了方法的重用性

引用的方法包括:静态方法,实例方法,特定类型的任意对象方法引用,构造方法引用

KindExample

Reference to a static method

ContainingClass::staticMethodName

Reference to an instance method of a particular object

containingObject::instanceMethodName

Reference to an instance method of an arbitrary object of a particular type

ContainingType::methodName

Reference to a constructor

ClassName::new

引用静态方法,如上面例子所示

Person::compareByAge

引用实例方法,创建实例,就可以应用对象中的任意方法

classComparisonProvider {public intcompareByName(Person a, Person b) {returna.getName().compareTo(b.getName());

}public intcompareByAge(Person a, Person b) {returna.getBirthday().compareTo(b.getBirthday());

}

}

ComparisonProvider myComparisonProvider= newComparisonProvider();

Arrays.sort(rosterAsArray, myComparisonProvider::compareByName);

特定类型的任意对象方法引用,例如String,和上面引用几乎相同,只是应用于基本数据类型等

String[] stringArray = { "Barbara", "James", "Mary", "John","Patricia", "Robert", "Michael", "Linda"};

Arrays.sort(stringArray, String::compareToIgnoreCase);

引用构造方法

public static , DEST extends Collection>DEST transferElements(

SOURCE sourceCollection,

SuppliercollectionFactory) {

DEST result=collectionFactory.get();for(T t : sourceCollection) {

result.add(t);

}returnresult;

}

函数式接口Supplier能够调用无参构造函数,返回一个对象,

Set rosterSetLambda =transferElements(roster, ()-> { return new HashSet<>(); });

也可以使用构造方法引用代替lambda表达式,构造对象

Set rosterSet = transferElements(roster, HashSet::new);

JAVA编译器能够推断出你想创建一个容器,所以可以指定容器包含的类型,如下

Set rosterSet = transferElements(roster, HashSet::new);

java8方法引用符合_java8,方法引用相关推荐

  1. java8方法引用符合_Java8 方法引用和构造方法引用

    如果不熟悉Java8新特性的小伙伴,初次看到函数式接口写出的代码可能会是一种懵逼的状态,我是谁,我在哪,我可能学了假的Java,(・∀・(・∀・(・∀・*),但是语言都是在进步的,就好比面向对象的语言 ...

  2. Java8 之 lambda 表达式、方法引用、函数式接口、默认方式、静态方法

    今天我来聊聊 Java8 的一些新的特性,确实 Java8 的新特性的出现,给开发者带来了非常大的便利,可能刚刚开始的时候会有点不习惯的这种写法,但是,当你真正的熟悉了之后,你一定会爱上这些新的特性的 ...

  3. Java栈内存、堆内存、方法区对对象和引用的关系

    问题:Java栈内存.堆内存.方法区对对象和引用的关系 答案: 1.单个对象 如图所示: (1)首先类加载器加载要运行的类,首先将main方法加载进方法区,并进栈内存,顺序执行代码,创建对象,将对象的 ...

  4. java面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

    java面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递.Java编程语言只有值传递参数. 当一个对象实 ...

  5. 引用数据类型的方法调用

    引用数据类型的方法调用 /*** 引用数据类型的方法调用*/ public class TestRefArgs{public static void main(String[] args) {Poin ...

  6. c/c++教程 - 2.2 引用的使用方法,引用做函数参数,引用做返回值,引用的本质,常量引用

    2. 引用 学习目的:取代C中的指针. 目录 2. 引用 2.1 引用的基本使用方法 2.2 引用注意事项 2.3 引用做函数参数 2.4引用做函数返回值 2.5 引用的本质 2.6 常量引用 相关教 ...

  7. golang中包互相引用的解决方法

    golang中包互相引用的解决方法 参考文章: (1)golang中包互相引用的解决方法 (2)https://www.cnblogs.com/chukuang2004/p/6930898.html ...

  8. vue父组件引用子组件方法显示undefined问题原因及解决方法

    vue父组件引用子组件方法显示undefined问题原因及解决方法 参考文章: (1)vue父组件引用子组件方法显示undefined问题原因及解决方法 (2)https://www.cnblogs. ...

  9. java 方法引用_JAVA 8 方法引用 - Method References

    什么是方法引用 简单地说,就是一个Lambda表达式.在Java 8中,我们会使用Lambda表达式创建匿名方法,但是有时候,我们的Lambda表达式可能仅仅调用一个已存在的方法,而不做任何其它事,对 ...

最新文章

  1. Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)
  2. ValueError: Error when checking : expected input_1 to have 4 dimensions, but got array with shape (X
  3. 模型评估——ROC、KS
  4. 工具坐标6点法_轻松学机器人系列之各坐标系关系
  5. 【算法】最小的K个数
  6. Condition源码分析
  7. leetcode 121. 买卖股票的最佳时机
  8. 三星sec.android.soagent,3.0降级2.5教程
  9. 三.rocketmq-console
  10. C# 委托和事件高级进阶
  11. recvmsg和sendmsg函数
  12. 浅谈怎样入侵服务器,仅供学习用
  13. python坐标轴的粗细设置
  14. HTPPS请求 证书 解决方案
  15. draggrid简单用法
  16. 8月1日任务 11.14-11.17
  17. 经纬度坐标转换为屏幕坐标
  18. java-net-php-python-jspm综合彩妆店管理系统查重PPT计算机毕业设计程序
  19. ABP中服务接口Web.Host部署踩坑
  20. ## IDEA创建maven项目没有src目录问题解决

热门文章

  1. mysql如何实现acid中的a_MySQL如何实现事务的ACID
  2. oracle 查询数据库io,理解Oracle中的并行查询IO
  3. cmd中检测远程的ip和端口是否处于监听状态
  4. flume+elasticsearch日志收集分析
  5. app端微信支付(二) - 生成预付单
  6. 云平台项目实战(华为篇)之存储技术
  7. listview滚动到底部
  8. JFinal 1.1.4 发布,JAVA极速WEB+ORM框架
  9. 我儿子现在读一年级,到现在读了3个月,这个是今天老婆叫我给他打印的英语卡片,晕啊...
  10. 小希的迷宫 HDU - 1272 (并查集)