java8新特性lambda表达式、函数式编程、方法引用和接口默认方法以及内部类访问外部变量
一提到java是一种什么语言?
大多数人肯定异口同声的说是一门面向对象的语言,这种观点从我们开始学java就已经根深蒂固了,但是学到java8新特性函数式编程的时候,我才知道java并不是纯面向对象的语言。
lambda表达式的详细教程
lambda代码练习:
package Lambda;public interface ImyWork {void dowork();}
package Lambda;import org.junit.Before;
import org.junit.Test;public class LambdaTest {public LambdaTest() {System.out.println("构造方法");}public void wrapWork(ImyWork work){System.out.println("doworking");work.dowork();}@Testpublic void test(){//原始代码
/* this.wrapWork(new ImyWork() {@Overridepublic void dowork() {System.out.println("dowork");}});System.out.println("testing");*///简化this.wrapWork(()->System.out.println("dowork"));System.out.println("testing");}
}
函数式编程
并行并发/基于事件的开发
举个Jquery中例子:
$(functionn(){$('.click').click(function(){myClickLogic();
})
那么我们在java中也可以写成如上的代码样式?
List<Integer> a = new ArrayList<>();a.add(1);a.add(3);a.add(2);a.add(4);//传统写法a.sort(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return Integer.compare(o2, o1);}});//lambda表达式a.sort((o1,o2)->Integer.compare(o2, o1));System.out.println(a);
函数式接口
1.我们把能够写lambda表达式的地方?一个接口,且接口里面只有一个抽象方法
2.在java中,把只有一个抽象方法的接口称为函数式接口,如果一个接口是函数式接口,我们可以在接口上添加@FunctionalInterface标签标明这是一个函数式接口(接上注解@..会提供报错警告也就是如果书写的不满足函数式接口会报错,否则不会报错)
3.无论是否标示@FunctionalInterface,只要满足函数式接口的接口,java都会直接识别为函数式接口
4.简化函数式接口的使用是java中提供lambda表达式唯一的作用
5.可以用接口来引用表达式,如上述Test中的代码可以写成ImyWork work=()->System.out.println("dowork");
编译后编译器会帮我们向接口ImyWork反推出之前原本的代码
this.wrapWork(work);
6.函数式接口里面可以写Object对象中的方法
7.lambda表达式中的异常处理:lambda表达式中产生的异常要么直接在代码块中处理
//第一种方法抛出异常
private void test1() {
ImyWork work=()->System.out.println("dowork");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.wrapWork(work);
}
要么在接口方法声明时抛出 如下所示
@FunctionalInterface
public interface ImyWork {void dowork() throws Exception;}
方法引用
概念
1.类::方法(如上代码就是属于这种)
public class FunYinYong {public static void main(String[] args) {List<Integer> a = new ArrayList<>();a=Arrays.asList(1,2,4,3);/*常用的lambda表达式*/a.sort((x,y)->Integer.compare(x, y));System.out.println(a);/*lambda表达式中的方法引用*/a.sort(Integer::compare);}
}
- 对象::方法
public class FunYinYong {public FunYinYong(){}private int compare(int x,int y) {return Integer.compare(x, y);}public static void main(String[] args) {List<Integer> a = new ArrayList<>();a=Arrays.asList(1,2,4,3);/*lambda表达式*/a.sort((x,y)->Integer.compare(x, y));System.out.println(a);/*方法引用 类::方法*/a=Arrays.asList(1,2,4,3);a.sort(Integer::compare);System.out.println(a);/*方法引用 对象::方法*/a=Arrays.asList(1,2,4,3);FunYinYong it = new FunYinYong();a.sort(it::compare);System.out.println(a);/*对象::方法 foreach方法使用*/a.forEach(num->System.out.print(num));System.out.println();/*对象::方法 foreach方法使用最简式 */a.forEach(System.out::print);}@Testvoid Test(){/*this也可以使用但不能再main方法中使用因为main方法为静态方法在独立空间内获取不到当前类的对象*/List<Integer> a = new ArrayList<>();a=Arrays.asList(1,2,4,3);a.sort(this::compare);System.out.println(a);}
}
3.类构造方法引用 类::new ,构造器引用对应的函数式接口里面的方法个事一定是返回一个对象/方法没有参数,懒得敲代码了截图吧!
接口默认方法
接口的默认方法和静态方法
内部类访问外部变量
确实如此,我们不能在局部内部类中修改局部变量,甚至在局部内部类外修改被局部内部类使用但没有声明为final的局部变量,这一切和java8之前一样,java8中唯一改变的就是我们不用显示的在一个局部变量前加上final关键字,如果我们反编译生成的类文件,可以看到,编译器已经相应的位置上加上了final关键字。不过,即使只有这一点改变,也算是改进,至少我们不必无缘无故的在某个方法参数或者局部变量前加上final
还有新特性等以后参加工作并且深入学习后再补充!
java8新特性lambda表达式、函数式编程、方法引用和接口默认方法以及内部类访问外部变量相关推荐
- Java8新特性----Lambda表达式详细探讨
Java8新特性 Lambda表达式 入门演示 案例1 如何解决 cannot be cast to java.lang.Comparable问题? 案例2 优化方式一 : 策略设计模式 优化方式二: ...
- java8新特性-lambda表达式入门学习
定义 jdk8发布新特性中,lambda是一大亮点之一.lambda表达式能够简化我们对数据的操作,减少代码量,大大提升我们的开发效率.Lambda 表达式"(lambda expressi ...
- java8新特性lambda表达式概述
定义 jdk8发布新特性中,lambda是一大亮点之一.lambda表达式能够简化我们对数据的操作,减少代码量,大大提升我们的开发效率.Lambda 表达式"(lambda expres ...
- 【Java】Java8新特性Lambda表达式和Stream API
Lambda表达式是实现支持函数式编程技术的基础. 函数式编程与面向对象编程:函数式编程将程序代码看作数学中的函数,函数本身作为另一个函数参数或返回值,即高阶函数.而面向对象编程按照真实世界客观事物的 ...
- Java8 新特性 -- Lambda表达式:函数式接口、方法的默认实现和静态方法、方法引用、注解、类型推测、Optional类、Stream类、调用JavaScript、Base64
文章目录 1. Lambda表达式 1.1 Lambda表达式语法 1.2 Lambda表达式示例 1.3 说明:函数式接口 2. 方法的默认实现和静态方法 3. 方法引用 3.1 方法引用示例 4. ...
- java compare 返回值_关于Java你不知道的那些事之Java8新特性[Lambda表达式和函数式接口]...
前言 为什么要用Lambda表达式? Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码,将代码像数据一样传递,这样可以写出更简洁.更灵活的代码,作为一个更紧凑的代码风 ...
- Java8新特性——lambda表达式
什么是lambda表达式? Lambda 表达式是Java 8 的新特性,是一种新的编程语法.lambda语义简洁明了,性能良好,是Java 8 的一大亮点.废话不多说,我们来看个例子. 从内部类到l ...
- Java8 新特性lambda表达式(一)初始
本篇参考Richard Warburton的 java8 Lambdas :Functional Programming for the Masses 学习lambda表达式之前,需要知道什么是函数式 ...
- 2020.10.20课堂笔记(java8新特性 lambda表达式)
一.什么是Lambda? 我们知道,对于一个Java变量,我们可以赋给其一个"值". 如果你想把"一块代码"赋给一个Java变量,应该怎么做呢? 比如,我想把右 ...
最新文章
- 南方科技大学宋毅课题组招聘启事
- .NET 4.5 Task异步编程学习资料
- js处理富文本编辑器转义、去除转义、去除HTML标签
- MYSQL的replace into
- 多重索引DataFrame插入数据的方法探索
- SetDll把Dll文件注入到.exe应用程序中
- 1990-2000年事务处理流程图和数据流图试题分析
- Java基础:基础加强巩固
- JSP指令:page指令,errorPage和isErrorPage
- HP P2000 G3阵列故障经历
- WebStorm自定义主题/护眼主题
- Vue自定义组件——图片放大器,js点击<img>触发图片放大,富文本内图片点击实现放大器效果
- 如何批量生成ISBN条码
- 实验六 视图的创建与管理
- 笔记本显卡和台式显卡区别介绍
- 深度自定义macOS邮件程序的个性签名内容
- Ubantu安装成功后重启时出现please remove the installation medium,then press enter
- 解决height:100vh超出屏幕高度的问题
- 无法引导Win11卡在GNU GRUB界面
- Excel 阅读模式 高亮标记 聚光灯效果 “完美“解决方案
热门文章
- AI应用开发基础傻瓜书系列3-损失函数
- 现代软件工程 学生阅读和调查作业
- 现代软件工程 作业 文本文件中英语单词的频率
- JAVA入门级教学之(方法-2)
- linux delete内存不下降_linux内存分配管理
- exfat最佳单元大小_双动圈四喇叭单元的头戴式耳机,DACOM HF002上手体验
- php论坛系统教程,国内php原创论坛
- selinux= 为 disabled_安德里茨为巴西KLabin Puma II 项目提供气化炉和生物质处理线
- thymealf如何实现传单个变量给html_梦回2013,看尤大vue的第一行代码,如何用30行代码实现vue(超简洁,适合初学者)...
- 【LeetCode笔记 - 每日一题】519. 随机翻转矩阵(Java、随机、双指针)