javajdk8中lambda关于(::)双引号使用

更新时间:2023-07-08 14:38:26 阅读: 评论:0

javajdk8中lambda关于(::)双引号使⽤
1.发现问题
在代码中看见这段代码,让我懵逼了⼀下。
Counter counter(Id id) {
return (OrCreate(id, this::newCounter, NopCounter::new);川贝怎么吃
}
2.寻找答案
this::newCounter 表⽰什么意思呢?
猜⼀猜,⼤概就是调⽤当前对象的⽅法的意思。
-----------------------
NopCounter::new 表⽰什么意思呢?
这个猜测是 new了⼀个新对象的意思。
作为⼀个严谨的程序员当然要有得到准确的答案
四川刘汉大案3.学习lambda关于新特性的学习
Jdk8中有好多新的特性,⽐如引⼊Lambda,简化代码的书写等等
我们先看⼀个关于Lambda的使⽤
/**
* 输出list
*/
@Test
public void test() {
String[] array = {"aaaa", "bbbb", "cccc"};
List<String> list = Arrays.asList(array);
//Java 7
for(String s:list){
System.out.println(s);
}
//Java 8
list.forEach(System.out::println);
}
其中list.forEach(System.out::println);就是Java 8中的Lambda写法之⼀, 有没有特别注意到输出语句跟我们平时写的syso语句不⼀样,常规输出语句是这样的:
System.out.println(“流浪地球拍的不错哦!”);
这⾥⾯使⽤到了::, 有点意思,来认识⼀下这个新东西!
双冒号(::)
英⽂:double colon,双冒号(::)运算符在Java 8中被⽤作⽅法引⽤(method reference),⽅法引⽤是与lambda表达式相关的⼀个重要特性。它提供了⼀种不执⾏⽅法的⽅法。为此,⽅法引⽤需要由兼容的函数接⼝组成的⽬标类型上下⽂。
Method References
You u lambda expressions to create anonymous methods. Sometimes, however, a lambda expression does nothing but call an existing method. In tho cas, it’s often clearer to refer to the existing method by name. Method references enable you to do this; they are compact, easy-to-read lambda expressions for methods that already have a name.
关于⽅法引⽤的描述,摘⾃oracle官⽹
⼤致意思是,使⽤lambda表达式会创建匿名⽅法, 但有时候需要使⽤⼀个lambda表达式只调⽤⼀个已经存在的⽅法(不做其它), 所以这才有了⽅法引⽤!
以下是Java 8中⽅法引⽤的⼀些语法:
静态⽅法引⽤(static method)语法:classname::methodname 例如:Person::getAge 对象的实例⽅法引⽤语法:instancename::methodname 例如:System.out::println
对象的超类⽅法引⽤语法: super::methodname
类构造器引⽤语法: classname::new 例如:ArrayList::new
数组构造器引⽤语法: typename[]::new 例如: String[]:new
轩辕姓如果上的语法太枯燥,那就通过⼀些例⼦来加强对它的理解:
静态⽅法语法使⽤例⼦:
@RunWith(SpringJUnit4ClassRunner.class)
@ComponentScan("com.zhoufy")
public class Demo {
@Test
public void test() {
List<String> list = Arrays.asList("aaaa", "bbbb", "cccc");
//静态⽅法语法 ClassName::methodName
list.forEach(Demo::print);想的英文
婴儿舌苔厚白是怎么回事}
public static void print(String content){
System.out.println(content);
}
}
类实例⽅法语法使⽤例⼦:
public class Demo {
@Test
public void test() {
List list = Arrays.asList(“aaaa”, “bbbb”, “cccc”);
//对象实例语法 instanceRef::methodName
list.forEach(new Demo()::print);
}
public void print(String content){
System.out.println(content);
}
}
超类⽅法语法使⽤例⼦:
public class Example extends BaExample{干扰水晶
@Test
public void test() {
List<String> list = Arrays.asList("aaaa", "bbbb", "cccc");
//对象的超类⽅法语法: super::methodName
list.forEach(super::print);
}
}
class BaExample {
public void print(String content){
System.out.println(content);
}
}
类构造器语法使⽤例⼦:
public class Example {
@Test
public void test() {
InterfaceExample com =  Example::new;
Example bean = ate();
System.out.println(bean);
}
}
interface InterfaceExample{
Example create();
}
如果是带参数的构造器,⽰例如下:
public class Example {
private String name;
Example(String name){
this.name = name;
}
public static void main(String[] args) {
InterfaceExample com =  Example::new;
Example bean = ate("hello world");
身上起小红点很痒System.out.println(bean.name);
}
}
interface InterfaceExample{
Example create(String name);
}
这⾥需要特别注意的是:Example 类并没有implements InterfaceExample接⼝哦数组构造器语法使⽤例⼦:
public class Example {
public static void main(String[] args) {
Function <Integer, Example[]> function = Example[]::new;
Example[] array = function.apply(4); //这⾥的4是数组的⼤⼩
for(Example e:array){
System.out.println(e); //如果输出的话,你会发现会输出4个空对象(null)
}
}
}
这⾥是借⽤jdk⾃带的java.util.function.Function类实现的,如果想要⾃定义接⼝
public class Example {
public static void main(String[] args) {
Interface <Integer, Example[]> function = Example[]::new;
Example[] array = function.apply(4); //这⾥的4是数组的⼤⼩
for(Example e:array){
System.out.println(e);
}
幸福议论文}
}
@FunctionalInterface
interface Interface<A, T>{
T apply(A a);
}
总结⼀下
其实,JVM 本⾝并不⽀持指向⽅法引⽤,过去不⽀持,现在也不⽀持。
Java 8 对⽅法引⽤的⽀持只是编译器层⾯的⽀持,虚拟机执⾏引擎并不了解⽅法引⽤。编译器遇到⽅
法引⽤的时候,会像上⾯那样⾃动推断出程序员的意图,将⽅法引⽤还原成接⼝实现对象,或者更形象地说,就是把⽅法引⽤设法包装成⼀个接⼝实现对象,这样虚拟机就可以⽆差别地执⾏字节码⽂件⽽不需要管什么是⽅法引⽤了。
需要注意的是,⽅法引⽤是⽤来简化接⼝实现代码的,并且凡是能够⽤⽅法引⽤来简化的接⼝,都有这样的特征:有且只有⼀个待实现的⽅法。这种接⼝在 Java 中有个专门的名称: 函数式接⼝。当你⽤试图⽤⽅法引⽤替代⼀个⾮函数式接⼝时,会有这样的错误提⽰: xxx is not a functional interface。

本文发布于:2023-07-08 14:38:26,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1073087.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:对象   语法   输出   函数   构造   表达式   实现
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图