java8方法引用符合_java8,方法引用
当我们使用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,方法引用相关推荐
- java8方法引用符合_Java8 方法引用和构造方法引用
如果不熟悉Java8新特性的小伙伴,初次看到函数式接口写出的代码可能会是一种懵逼的状态,我是谁,我在哪,我可能学了假的Java,(・∀・(・∀・(・∀・*),但是语言都是在进步的,就好比面向对象的语言 ...
- Java8 之 lambda 表达式、方法引用、函数式接口、默认方式、静态方法
今天我来聊聊 Java8 的一些新的特性,确实 Java8 的新特性的出现,给开发者带来了非常大的便利,可能刚刚开始的时候会有点不习惯的这种写法,但是,当你真正的熟悉了之后,你一定会爱上这些新的特性的 ...
- Java栈内存、堆内存、方法区对对象和引用的关系
问题:Java栈内存.堆内存.方法区对对象和引用的关系 答案: 1.单个对象 如图所示: (1)首先类加载器加载要运行的类,首先将main方法加载进方法区,并进栈内存,顺序执行代码,创建对象,将对象的 ...
- java面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
java面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递.Java编程语言只有值传递参数. 当一个对象实 ...
- 引用数据类型的方法调用
引用数据类型的方法调用 /*** 引用数据类型的方法调用*/ public class TestRefArgs{public static void main(String[] args) {Poin ...
- c/c++教程 - 2.2 引用的使用方法,引用做函数参数,引用做返回值,引用的本质,常量引用
2. 引用 学习目的:取代C中的指针. 目录 2. 引用 2.1 引用的基本使用方法 2.2 引用注意事项 2.3 引用做函数参数 2.4引用做函数返回值 2.5 引用的本质 2.6 常量引用 相关教 ...
- golang中包互相引用的解决方法
golang中包互相引用的解决方法 参考文章: (1)golang中包互相引用的解决方法 (2)https://www.cnblogs.com/chukuang2004/p/6930898.html ...
- vue父组件引用子组件方法显示undefined问题原因及解决方法
vue父组件引用子组件方法显示undefined问题原因及解决方法 参考文章: (1)vue父组件引用子组件方法显示undefined问题原因及解决方法 (2)https://www.cnblogs. ...
- java 方法引用_JAVA 8 方法引用 - Method References
什么是方法引用 简单地说,就是一个Lambda表达式.在Java 8中,我们会使用Lambda表达式创建匿名方法,但是有时候,我们的Lambda表达式可能仅仅调用一个已存在的方法,而不做任何其它事,对 ...
最新文章
- Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)
- ValueError: Error when checking : expected input_1 to have 4 dimensions, but got array with shape (X
- 模型评估——ROC、KS
- 工具坐标6点法_轻松学机器人系列之各坐标系关系
- 【算法】最小的K个数
- Condition源码分析
- leetcode 121. 买卖股票的最佳时机
- 三星sec.android.soagent,3.0降级2.5教程
- 三.rocketmq-console
- C# 委托和事件高级进阶
- recvmsg和sendmsg函数
- 浅谈怎样入侵服务器,仅供学习用
- python坐标轴的粗细设置
- HTPPS请求 证书 解决方案
- draggrid简单用法
- 8月1日任务 11.14-11.17
- 经纬度坐标转换为屏幕坐标
- java-net-php-python-jspm综合彩妆店管理系统查重PPT计算机毕业设计程序
- ABP中服务接口Web.Host部署踩坑
- ## IDEA创建maven项目没有src目录问题解决
热门文章
- mysql如何实现acid中的a_MySQL如何实现事务的ACID
- oracle 查询数据库io,理解Oracle中的并行查询IO
- cmd中检测远程的ip和端口是否处于监听状态
- flume+elasticsearch日志收集分析
- app端微信支付(二) - 生成预付单
- 云平台项目实战(华为篇)之存储技术
- listview滚动到底部
- JFinal 1.1.4 发布,JAVA极速WEB+ORM框架
- 我儿子现在读一年级,到现在读了3个月,这个是今天老婆叫我给他打印的英语卡片,晕啊...
- 小希的迷宫 HDU - 1272 (并查集)