1.方法引用就是用双冒号“::”来简化Lambda表达式
2.方法引用四种引用方式:
1)对象名::实例方法名 //用对象名调用实例方法
2)类名::静态方法名 //用类名引用静态方法

@FunctionalInterface
interface StringFunc{
public String func(String s);
}
public class app13_9 {
//定义静态方法sop
static String sop(StringFunc sf,String s){
return sf.func(s);//是函数式接口类型
}
public static void main(String[] args) {//Lambda表达式作为参数传递给方法
//先定义字符型变量instr以及outstr,并输出原字符
String outstr,instr = "Lambda 表达式 good";
System.out.println("原字符串:"+instr);
//将字符串instr转换成大写赋值给outstr
outstr = sop((str)->str.toUpperCase(),instr);
System.out.println("转换成大写字母后:"+outstr);
//将字符串去掉空格后
outstr = sop((str)->{
String result = "";
for (int i = 0; i <str.length(); i++) {
if(str.charAt(i)!=' '){//charAt()方法返回指定位置字符
result+=str.charAt(i);
}
}
return result;
},instr);
System.out.println("去掉空格后的字符串:"+outstr);
//将字符串反序输出
StringFunc reverse = (str)->{
String result ="";
for (int i = str.length()-1; i >=0 ; i--) {
result+=str.charAt(i);
}
return result;
};
System.out.println("反序后字符串:"+sop(reverse,instr));
}
}

3)类名::实例方法名 //用类名引用实例方法名
第一个参数作为方法调用者,其他参数传递给方法
字符串1.compareTo(字符串2)
str1::compareTo等价于(str1,str2)->str1.compareTo(str2);
4)类名::new //用类名引用构造方法
可把构造按方法引用赋值给与构造方法具有相同相同方法头的任何函数式接口对象

@FunctionalInterface
interface IShow<T>{
public T create(String s,int n);
}
class Persons{
String name;
int age;
public Persons(){
name = "刘洋";
age = 24;
}
public Persons(String n,int a){
this.name = n;
this.age = a;
}
@Deprecated
public String toString(){
return "姓名:"+this.name+",年龄:"+this.age;
}
}
public class app13_11 {
public static void main(String[] args) {
IShow<Persons> na = Persons::new;//创建Persons构造方法的引用
Persons p = na.create("陈磊",23);//调用create()方法,但引用Persons构造方法
System.out.println(p);
}
}

3.注意:被引用方法参数列表和返回值类型,必须与函数式接口中的抽象方法参数列表和返回值类型
一致
4.说明:前三种方法引用::右边的方法名后不能有括号,第四种::后面只能是关键字
5.前两种只用于只有一个参数情况,方法等同于Lambda表达式
例如:System.out::print等同于System.out.println(s);
第三种用于两个及以上,第一个参数是调用方法对象

@FunctionalInterface
interface Ishow<P,R>{
//抽象方法info()的方法头与引用方法valueOf()的方法头有相同定义,方法info()的,名字就是方法引用的名字
public R info(P p);
}
public class app13_10 {
public static void main(String[] args) {
Ishow<Integer,String> ip = String::valueOf;//用类名String引用静态方法valueOf
String s = ip.info(886);//调用方法info相当于调用valueOf方法
System.out.println(s);
}
}

6.三种方式实现函数式接口Comsumer<T>,接口中包含一个抽象方法void accept(T t).
1)Comsumer<String> con = new Comsumer<String>
{
@Override
public void accept(String str){
System.out.println(str)}
};
con.accept("我是一个消费型接口");
2)Lambda表达式
Comsumer<String> con = str->System.out.println(str);
con.accept("我是一个消费接口");
3)方法引用
Comsumer<String> con =System.out::println
con.accept("我是一个消费接口")

总结:学习了四种方法引用

第一种:对象名::实例方法名

第二种:类名::静态方法名

第三种:类名::实例方法名

第四种:类名::new//类名引用构造方法

前两种中只有有一个参数,等同于Lambda表达式

//抽象方法info()的方法头与引用方法valueOf()的方法头有相同定义,方法info()的,名字就是方法引用的名字
public R info(P p);
着个语句没有理解,方法头是什么,并且为什么可以直接引用valueOf()函数
方法头指的是public R,R是泛型指方法的类型
IShow<Persons> na = Persons::new;//创建Persons构造方法的引用
类名::new构造方法引用赋值给Person类属性的接口类实现对象
Persons p = na.create("陈磊",23);//调用create()方法,但引用Persons构造方法
调用接口中的create()方法,但是却在定义Person类对象时调用了构造方法

五月十六号java基础知识点的更多相关文章

  1. 十六、Java基础---------集合框架之Set

    写在前面的话,这篇文章在昨天就写好了,今天打开的时候一不小心将第二天的文章粘贴到了这篇文章,很不幸的是除了标题之外依然面目全非,今天带着沉痛的心情再来写这篇文章! 上篇文章介绍了Collection体 ...

  2. 十六、JAVA基础(堆和栈)

    一.堆和栈 堆和栈都是JAVA中的存储结构,也就是说,都是内存中存放数据的地方. 1.堆:(存放由new创建的对象和数组) 引用类型的变量,内存分配一般在堆上或者常量池(字符串常量,基本数据类型常量) ...

  3. 《手把手教你》系列基础篇(七十六)-java+ selenium自动化测试-框架设计基础-TestNG实现DDT - 下篇(详解教程)

    1.简介 今天这一篇宏哥主要是结合实际工作中将遇到的测试场景和前边两篇学习的知识结合起来给大家讲解和分享一下,希望以后大家在以后遇到其他的测试场景也可以将自己的所学的知识应用到测试场景中. 2.测试场 ...

  4. 《手把手教你》系列基础篇(八十六)-java+ selenium自动化测试-框架设计基础-Log4j实现日志输出(详解教程)

    1.简介 自动化测试中如何输出日志文件.任何软件,都会涉及到日志输出.所以,在测试人员报bug,特别是崩溃的bug,一般都要提供软件产品的日志文件.开发通过看日志文件,知道这个崩溃产生的原因,至少知道 ...

  5. Java基础知识点总结

    前言 本文主要是我之前复习Java基础原理过程中写的Java基础知识点总结.Java的知识点其实非常多,并且有些知识点比较难以理解,有时候我们自以为理解了某些内容,其实可能只是停留在表面上,没有理解其 ...

  6. Java基础知识点(四)

    前言:记录Java基础知识点,方便熟悉与掌握. 1.面向对象的"六原则一法则" “六原则一法则”:单一职责原则.开闭原则.依赖倒转原则.里氏替换原则.接口隔离原则.合成聚合复用原则 ...

  7. 《手把手教你》系列技巧篇(五十六)-java+ selenium自动化测试-下载文件-上篇(详细教程)

    1.简介 前边几篇文章讲解完如何上传文件,既然有上传,那么就可能会有下载文件.因此宏哥就接着讲解和分享一下:自动化测试下载文件.可能有的小伙伴或者童鞋们会觉得这不是很简单吗,还用你介绍和讲解啊,不说就 ...

  8. 《手把手教你》系列技巧篇(六十六)-java+ selenium自动化测试 - 读写excel文件 - 上篇(详细教程)

    1.简介 在自动化测试,有些我们的测试数据是放到excel文件中,尤其是在做数据驱动测试的时候,所以需要懂得如何操作获取excel内的内容.由于java不像python那样有直接操作Excle文件的类 ...

  9. Java基础知识点(三)

    前言:准备将Java基础知识点总结成一个系列,用于平常复习并加深理解.每篇尽量做到短小精悍,便于阅读. 1.Math类中相关函数 Math.floor(x):返回不大于x的最大整数.eg:Math.f ...

  10. Java基础知识点(二)

    前言:Java的基础知识点不能间断. 1.Array和ArrayList的区别 关于Array的用法,参看:http://blog.csdn.net/b_11111/article/details/5 ...

随机推荐

  1. android studio 隐式Internet跳转

    直接setAction方法 Intent intent = new Intent(); intent.setAction("com.hly.view.fling"); startA ...

  2. 关于IllegalMonitorStateException异常的解释之一

    注意 在同步控制方法或同步控制块里调用wait(),notify()和notifyAll().如果在非同步控制方法里调用这些方法,程序能通过编译,但运行的时候,将得到IllegalMonitorSta ...

  3. doy 18 定时任务

    1.定时任务 1.什么是定时任务 类似日常生活之中的闹钟:主要用于定时执行某些命令,达到定时处理数据的作用. 2.定时任务的软件的种类 1.linux操作系统自带的软件:crontab 2.第三方的定 ...

  4. ADB 命令 使用

    基本用法 命令语法 为命令指定目标设备 启动/停止 查看 adb 版本 以 root 权限运行 adbd 指定 adb server 的网络端口 设备连接管理 查询已连接设备/模拟器 USB 连接 无 ...

  5. Crypto入门 (十二)转轮机加密

    前言: 杰弗逊转轮加密,可以自己手动排列完成但是繁琐而且容易弄错,还是建议使用编程,我在手动弄得时候就是复制粘贴少了一个字母,弄了很久才发现,如果编程得话,就不会这样拉 转轮机加密: 题目如下: 1: ...

  6. Linux拷贝以及赋权

    拷贝     cp -r  /源文件/* 目标文件/&     //&后台运行符 改变权限  sudo chown -R 用户:群组  文件名           // sudo ch ...

  7. Leecode 141.环形链表(Java 快慢指针)

        想法: 1:遍历链表,每次判断节点是否被访问过.(哈希表) 2:快慢指针(看题解之后)     两个指针pq都在head头指针开始(初始化):     快指针每次走两步,慢指针每次走一步,如果 ...

  8. Spring mvc 使用RestController 和 Controller

    1.RestController相当于Controller和ResponseBody两个注解功能的结合体 2.只有Controller 返回的结果是 视图,一个页面 . 这个要自己写相关的 hello ...

  9. 在MDK 5中打开MDK 4工程要注意的问题1

    我是生手,对于MDK的理解还很简单.以下内容是遇到的一种情况. 有一个MDK 4工程,要求顺序点亮4个LED灯,工程已经建好. 在MDK 5中打开,编译都没问题,要烧写时,提示"can no ...

  10. 自动化兼容性测试工具——WeTest

    这个作业属于哪个课程 2021春软件工程实践|W班(福州大学) 这个作业要求在哪里 软件工程实践总结&个人技术博客 这个作业的目标 分享自动化兼容性测试工具的使用 其他参考文献 ... 目录 ...