lambda与方法引用
哈喽,大家好,我是指北君。
虽然目前Java最新版本都已经到16了,但是绝大部分公司目前用的Java版本都是8,想当初Java8问世后,其Lambda表达式与方法引用可是最亮眼的新特性,目前,这两个特性也被大家广泛使用,所以今天指北君就带大家看看这两个特性
1.Lambda
从JDK1.8开始为了简化使用者进行代码开发,专门提供有Lambda表达式的支持,利用此操作形式可以实现函数式的编程,对于函数式编程比较著名的语言:haskell,Scala,利用函数式的编程可以避免掉面向对象编程之中的一些繁琐的问题。 面向对象在其长期发展的过程中一直有一部分的反对者认为面向对象过于繁琐
比如:
public interface IMessage {
public void send(String str);
}
public class Demo {
public static void main(String args[]){
IMessage msg = new IMessage() {
@Override
public void send(String str) {
System.out.println("消息发送:"+str);
}
};
msg.send("hahahaha");
}
}
上面语句的核心功能只有一行核心语句,但是为了这一行核心语句依然需要按照完整的面向对象给出的设计结构进行开发。所以Lambda出现啦。
public interface IMessage {
public void send(String str);
}
public class Demo {
public static void main(String args[]){
IMessage msg = (str)->{
System.out.println("发送消息:"+str);
};
msg.send("hahahaha");
}
}
简单吧,这种形式就避免了复杂的面向对象结构化的要求。
Lambda表达式如果要想使用,那么必须有一个重要的实现要求:SAM(Single Abstract Method)只有一个抽象方法(但可以有default和static方法),以IMessage接口为例,在这个接口里面发现只是提供有一个send()方法,除此之外没有任何其他方法定义,所以这样的接口就被称为函数式接口,而只有函数式接口才可以被Lambda表达式所使用
jdk1.8之后可以在接口里面定义static方法和default方法也是为了函数式编程而设置的,如下面这个是允许的
public interface IMessage {
public void send(String str);
public default void defaultMethod(){
System.out.println("hahahaha");
};
}
public class Demo {
public static void main(String args[]){
IMessage msg = (str)->{
System.out.println("发送消息:"+str);
};
msg.send("hahahaha");
msg.defaultMethod();
}
}
对于Lambda表达式而言,提供了如下几种格式
1) 方法没有参数:()-->{ };
2) 方法有参数:(参数,参数)-->{ };
- 如果现在只有一行语句返回:(参数,参数)-->语句;
我们看下第三种
public interface IMath {
public int add(int x,int y);
}
public class Demo {
public static void main(String args[]){
IMath math = (t1,t2) -> t1 + t2;
System.out.println(math.add(10,20));
}
}
利用Lambda表达式可以使代码更加简便
其中一个很经典的应用就是多线程Runnable接口的例子
public class Test{
public static void main(String[] args) {
/*
匿名内部类的方式
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("nihao");
}
}).start();
System.out.println("你好");
*/
//lambda的方式
new Thread(()-> {
for(int i = 1 ; i<100 ; i++){
System.out.println("It is a lambda function!");
}
}).start();
}
}
2.方法引用
引用数据类型最大的特点是可以进行内存的指向处理,但是在传统的开发之中一直所使用的只是对象引用操作,而jdk1.8以后也提供有方法的引用,即:不同的方法名称可以描述同一个方法(即可以为一个方法定义多个名字,但是要求必须是函数式接口)。如果要进行方法的引用在java里面提供了如下的四种形式
1)引用静态方法: 类名称 :: static方法名称;
2)引用某个实例对象的方法: 实例化对象 :: 普通方法;
3)引用特定类型的方法: 特定类 :: 普通方法;
4)引用构造方法: 类名称 :: new ;
2.1 引用静态方法:
在String类里面提供有String.valueOf( )方法,这个方法就属于静态方法。
方法范例:public static String valueOf(int i),该方法有参数还有返回值
@FunctionalInterface //函数式接口
public interface IFunction<P,R> {
public R change(P p); //p描述的是参数,R描述的是返回值
}
public class Demo {
public static void main(String args[]){
IFunction<Integer , String > fun = String :: valueOf;
String str = fun.change(100);
System.out.println(str.length());
}
}
输出结果为:3
2.2 引用某个实例对象的方法
String类里面有个转大写的方法: public String toUpperCase( )
这个方法是必须在有实例化对象提供的情况下才可以调用
@FunctionalInterface //函数式接口
public interface IFunction<R> {
public R upper();
}
public class Demo {
public static void main(String args[]){
IFunction<String> fun = "hahaha" :: toUpperCase; //"hahaha"为String的实例化对象
System.out.println(fun.upper());
}
}
输出结果为:hahaha
2.3 引用特定类型的方法
在方法引用时也可以引用特定类中的一些操作方法,在String里面提供有一个字符串大小关系的比较
比较大小:public int compareTo(String anotherString)
这是一个普通方法,如果要引用普通方法,则往往都需要实例化对象,但是如果说现在你不想给出实例化对象,只是想引用这个方法,则就可以使用特定类来进行引用处理。
@FunctionalInterface //函数式接口
public interface IFunction<P> {
public int compare(P p1,P p2);
}
public class Demo {
public static void main(String args[]){
IFunction<String> fun = String :: compareTo ; //String类中的conpareTo方法
System.out.println(fun.compare("A","a"));
}
}
输出结果为:-34
2.4 引用构造方法
public class Person {
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public String toString(){
return "姓名:" + this.name + "、年级:" + this.age ;
}
}
@FunctionalInterface //函数式接口
public interface IFunction<R> {
public R create(String s ,int a);
}
public class Demo {
public static void main(String args[]){
IFunction<Person> fun = Person :: new ; //String类中的conpareTo方法
System.out.println(fun.create("张三",20));
}
}
输出结果:姓名:张三、年级:20
提供方法引用的概念更多情况下也只是弥补了对于引用的支持功能。
3 小结
本文介绍了Java8的新特性,lambda和方法引用,其为我们编程带来了便利,所以我们应该需要掌握它。
我是指北君,操千曲而后晓声,观千剑而后识器。感谢各位人才的:点赞、收藏和评论,我们下期更精彩!
lambda与方法引用的更多相关文章
- 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...
- [转]深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
以下内容转自: 作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-l ...
- Java8特性之Lambda、方法引用以及Stream流
Java 8 中的 Streams API 详解:https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/ Java笔记——Jav ...
- 函数式接口 & lambda表达式 & 方法引用
拉呱: 终于,学习jdk8的新特性了,初体验带给我的感觉真爽,代码精简的不行,可读性也很好,而且,spring5也是把jdk8的融入到血液里,总之一句话吧,说的打趣一点,学的时候自己难受,学完了写出来 ...
- Java笔记——Java8特性之Lambda、方法引用和Streams
Java8已经推出了好一段时间了,而掌握Java8的新特性也是必要的,如果要进行Spring开发,那么可以发现Spring的官网已经全部使用Java8来编写示例代码了,所以,不学就看不懂. 这里涉及三 ...
- Java8特性之Lambda、方法引用和Streams
这里涉及三个重要特性: Lambda 方法引用 Streams ① Lambda 最早了解Lambda是在C#中,而从Java8开始,Lambda也成为了新的特性,而这个新的特性的目的,就是为了消除单 ...
- Lambda学习---方法引用和其他基本应用
package com.zx; import java.util.*; import java.util.function.*; import java.util.stream.Collectors; ...
- java8之lambda表达式&方法引用(一)
本文将简单的介绍一下Lambda表达式和方法引用,这也是Java8的重要更新,Lambda表达式和方法引用最主要的功能是为流(专门负责迭代数据的集合)服务. 什么是lambda表达式 可以把lambd ...
- 黑马Lambda表达式学习 Stream流 函数式接口 Lambda表达式 方法引用
随机推荐
- 微信小程序云开发-数据库和云函数的应用-点赞/收藏/评论功能
一.准备工作 1.创建数据库表articles,字段分别为: 序号 字段名称 字段类型 字段值 字段描述 备注说明 1 title string "标题1" 文章标题 2 de ...
- BigDecimal之除不尽报错
当bigdecimal除不尽(循环小数)后会报错,下面的是BigDecimal ,divide方法提供的精确小数方法(推荐使用) BigDecimal avgCapital = loanAmount. ...
- [考试总结]noip模拟16
达成成就,一天更3篇总结. 又是一个暴力场 别问我为什么开局 \(5\) 分钟就问老师为什么 \(T3\) 没有提交的窗口. 开题读题,一路自闭到 \(T3\) ,发现 \(T3\) 可打暴力,所以一 ...
- 构建前端第12篇之---在Vue中对组件,变量,函数的全局引入
张燕涛写于2020-01-16 星期two 本篇还是源于import和export的使用,昨天看es6入门 和MDN文档,大体上用法了解了,但今天看ElementUI源码的时候,看到 //src/in ...
- java继承基础详解
java继承基础详解 继承是一种由已存在的类型创建一个或多个子类的机制,即在现有类的基础上构建子类. 在java中使用关键字extends表示继承关系. 基本语法结构: 访问控制符 class 子类名 ...
- 单片机学习(五)LCD1602和矩阵键盘的使用
目录 LCD1602的使用 矩阵键盘的使用 矩阵键盘相关电路图 按键检测扫描 制作密码输入器 LCD1602的使用 首先LCD1602是外接在开发板上的液晶屏外设,如图所示: 我们主要使用它来代替动态 ...
- Java 在Word中创建多级项目符号列表和编号列表
本文分享通过Java程序代码在Word中创建多级项目符号列表和编号列表的方法.程序运行环境如下: IntelliJ IDEA 2018(JDK 1.8.0) Word 2013 Word Jar包:F ...
- .NET 6 预览版 7 发布——最后一个预览版
原文:bit.ly/2VJxjxQ 作者:Richard 翻译:精致码农-王亮 说明:文中有大量的超链接,这些链接在公众号文章中被自动剔除,一部分包含超链接列表的小段落被我删减了,如果你对此感兴趣,请 ...
- 小白自学vue的第一天,加油!
一.插值的操作 1.Mustache语法 也就是双大括号(翻译过来就是胡须的意思) 2.v-once指令 加了v-once数据不会随着数据的改变而改变,只会渲染一次 3.v-html指令 可以解析HT ...
- C++//递增运算符重载
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 //重载递增运算符 6 7 //自定义 ...