内容简介:版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/love905661433/article/details/82818714
版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/love905661433/article/details/82818714
lambda表达式格式
- (参数) -> 单行语句; 不需要显式return, lambda表达式能自行判断出返回值
- (参数) -> {多行语句}; 如果方法有返回参数的话,需要显式的使用return
- (参数) -> 表达式;
函数式接口
对于只包含一个抽象方法的接口, 可以通过lambda表达式创建该接口的对象. 这种接口称为函数式接口
可以使用@FunctionalInterface
例如使用Lambda表达式来实现Runnable接口:
/** * 使用lambda式实现函数式接口时,只能转换成对应的接口对象, 转换成object对象都是错误的 * 如下面这条语句编译会报错 : Object obj = () -> System.out.println("使用lambda表达式来实现Runnable接口") ; * 输出结果: 使用lambda表达式来实现Runnable接口 */ Runnable r1 = () -> System.out.println("使用lambda表达式来实现Runnable接口") ; new Thread(r1).start();
- 需要注意的时, 如果你的lambda式存在检查期异常, 那么该异常需要在目标接口的抽象方法中进行声明. 如Runnable r2 = () -> Thread.sleep(100);这个lambda表达式无法编译通过.
方法引用
有时候你想传递给其他代码的操作已经有实现的方法了. 就可以使用方法引用
方法引用格式
- 引用静态方法 : 类名称 :: 静态方法名称
- 引用某个对象的方法 : 实例化对象 :: 普通方法
- 引用特定类型的方法 : 特定类 :: 普通方法
- 引用构造方法 : 类名称 :: new
方法引用使用样例
引用静态方法 :
// 声明为函数式接口 interface IMethodRef{ void print(String s); } public static void main(String [] args) { /** * 将IMethodRef中print方法的实现指向System.out.println方法 * 这里同样的,接口只能有一个抽象方法 * 输出结果 : Hello World */ IMethodRef ref = System.out :: println; ref.print("Hello World"); }
引用某个对象的方法 :
// 声明为函数式接口 @FunctionalInterface interface IMethodRef{ String upper(); } public static void main(String [] args) { /** * "Hello World" : 表示一个String实例 * IMethodRef的upper方法,引用String实例的toUpperCase()方法,等同于"Hello World".toUpperCase() * 输出结果 : HELLO WORLD */ IMethodRef ref = "Hello World" :: toUpperCase; System.out.println(ref.upper()) ; }
引用特定类型的方法 :
@FunctionalInterface interface IMethodRef{ int compareTo(BigDecimal big1, BigDecimal big2); } public static void main(String [] args) { IMethodRef ref = BigDecimal :: compareTo; // 等同于调用BigDecimal.ONE.compareTo(BigDecimal.ZERO), 输出结果是1 System.out.println(ref.compareTo(BigDecimal.ONE, BigDecimal.ZERO)) ; // 等同于调用BigDecimal.ZERO.compareTo(BigDecimal.ONE) , 输出结果是-1 System.out.println(ref.compareTo(BigDecimal.ZERO, BigDecimal.ONE)) ; }
引用构造方法 :
package lambda; class Person{ private String name; private int age; public Person(String name, int age) { this.name = name ; this.age = age ; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]" ; } } // 声明为函数式接口 @FunctionalInterface interface IMethodRef<T>{ T create(String name, int age); } public class MethodRefTest2 { public static void main(String [] args) { // 表示IMethodRef的create引用Person的构造方法来实现 IMethodRef<Person> ref = Person :: new; Person p = ref.create("七夜雪", 18); // 输出结果, Person [name=七夜雪, age=18] System.out.println(p) ; } }
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- ECMAScript正则表达式6个最新特性
- ECMAScript正则表达式6个最新特性
- Java8新特性 - Lambda表达式
- Java8特性①Lambda表达式
- Java 8新特性(一):Lambda表达式
- PHP8新特性之match表达式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
无处安放的互联网隐私
【美】茱莉亚·霍维兹 【美】杰拉米·斯科 / 中国人民大学出版社有限公司 / 2017-7-1 / CNY 55.00
在当今互联网时代,我们的隐私权已经受到了威胁,政府或企业可以追踪我们的电话,搜索引擎可以记录我们的在线浏览记录以及恒温器的设置以及更多信息。在当代,保卫隐私权不只是简单地描述出存在的问题或者警告人们隐私权已经丧失,隐私权的护卫者们提出了解决策略。他们密切关注商业实践、公共政策和技术设计以及人物,应该继续下去吗?条件就是:有问题,让我们找到解决之道。一起来看看 《无处安放的互联网隐私》 这本书的介绍吧!