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");
this.wrapWork(work);
编译后编译器会帮我们向接口ImyWork反推出之前原本的代码
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);}
}
  1. 对象::方法
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

还有新特性等以后参加工作并且深入学习后再补充!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509429.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javaWeb回忆思维导图

出处&#xff1a;https://blog.csdn.net/jackfrued/article/details/42617675 https://www.cnblogs.com/xieyupeng/p/6961667.html

Spring详细导包截图以及IOC和DI思想

思想 IOC DI Spring中的工厂(容器) ApplicationContext&#xff1a; BeanFactory(过时)&#xff1a; BeanFactory和ApplicationContext区别 BeanFactory&#xff1a; 1.Spring原始接口&#xff0c;针对原始接口实现类功能较为单一 2.是在getBean的时候才会生成类的实例…

毕业两年的我--奋斗中的程序员

又到一年毕业季&#xff0c;不知不觉&#xff0c;自己毕业快两年了&#xff0c;在这两年中&#xff0c;从一位小白程序员蜕化到现在的拥有两年经验的C程序员&#xff0c;这两年里面&#xff0c;不敢说成长有多快&#xff0c;进步有多大&#xff0c;但是感觉很踏实&#xff0c;每…

spring配置讲解

Bean元素 Bean元素进阶 scope属性&#xff1a; 1.singleton(默认值):单例对象.被标识为单例的对象在spring容器中只会存在一个实例 2.prototype:多例原型.被标识为多例的对象,每次再获得才会创建.每次创建都是新的对象.整合struts2时,ActionBean必须配置为多例的. 3.request…

情商低的七种表现,你占了几个

你身边有没有这样的人&#xff1a;大家刚刚还聊的热火朝天&#xff0c;却在他进门的瞬间&#xff0c;整场“冷冻结冰”&#xff0c;大家都各忙各的&#xff0c;避免与他交流。我们称这样的人为“冷场帝”。那么&#xff0c;“冷场帝”是如何养成的&#xff1f;这样的人通常情商…

spring属性注入

注入方式 set方法注入 构造函数注入 p名称空间注入 spel注入(#表示理解为引用) 练习代码&#xff1a; <!-- 第二天 set注入 index:索引 ref:引用对象 type:参数类型--><bean name"person" class"com.spring.bean.Person"><constructor-a…

你所不知道的C和C++运行库

转自&#xff1a;http://blog.csdn.net/ithzhang/article/details/20160009 你所不知道的C和C运行库    周五晚&#xff0c;小雨&#xff0c;少见的未加班。无聊&#xff0c;遂准备写一篇博客&#xff0c;介绍一下C和C运行库&#xff0c;只因发现工作几年的人对此一知半解的…

使用注解配置spring如@Compnent、@Service、@Consroller、@scope和@value的使用

步骤 1.导包42spring-aop如图&#xff1a;为学习到该阶段需要用到的包(里面的aoptest是spring和junit整合测试的时候用到的)2.为主配置文件引入新的命名空间(约束)3.开启使用注解代理配置文件<?xml version"1.0" encoding"UTF-8"?> <beans xmln…

java实现深度优先搜索 (DFS) 算法

度优先搜索&#xff08;Depth First Search&#xff0c;DFS&#xff09;算法是一种用于遍历或搜索图或树的算法。这种算法从一个节点开始&#xff0c;沿着一条路径尽可能深地搜索&#xff0c;直到遇到不能继续前进的节点时返回上一个节点&#xff0c;然后继续搜索其他路径。具体…

spring整合JDBC

文章目录spring提供了很多模板整合Dao技术spring中提供了一个可以操作数据库的对象.对象封装了jdbc技术.如何用Spring中的jdbc模板对数据库操作&#xff1a;spring配置进阶内容JDBCDaoSupport的使用spring提供了很多模板整合Dao技术 因为在jdbc、Hibernate、Mybatis中都有对数据…

spring中aop事务

文章目录事务为什要用到Spring中AOP事务事物的特性 ACID事务并发问题事务的隔离级别spring事务管理事务操作事务操作对象spring管理事务的属性介绍spring管理事务方式编码式xml配置(aop)注解配置Transactional注解在方法上添加Transactional注解在类上添加实际案例xml配置注入a…

Mybatis介绍、jdbc操作数据库原始写法以及Mybatis架构

文章目录Mybatis介绍jdbc操作数据库原生写法使用jdbc编程问题总结Mybatis架构Mybatis介绍 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code&#xff0c;并且改名为MyBatis 。2013年11月迁移到Github。 MyBatis是一个…

利用Mybatis写第一个数据库操作的程序

文章目录mybatis下载业务需求环境搭建加入配置文件创建pojosql映射文件加载映射文件实现根据id查询用户测试程序&#xff1a;效果mybatis下载 mybaits的代码由github.com管理 下载地址&#xff1a;https://github.com/mybatis/mybatis-3/releases 下载的mybatis文件如下&#…

利用Mybatis对数据库进行增删改查操作

文章目录mybatis模糊查找先来了解一下 #{}和${}的使用parameterType和resultType的使用selectOne和selectList的使用mysql自增主键返回方法一&#xff1a;mysql的函数函数返回方法二&#xff1a;定义useGeneratedKeys为true返回Mysql使用 uuid实现主键看到UUID和自增长的id想必…

聚合和组合的关系

转自&#xff1a;http://www.blogjava.net/lukangping/archive/2010/08/01/327693.html 记得在当时学习uml总是不好分清聚合与组合的关系&#xff0c;找工作时特地复习了这块的内容&#xff0c;结果正巧被面试官问道&#xff0c;这两天又在搞这块的内容&#xff0c;对聚合与组合…

关联和依赖的区别

最近研究设计模式&#xff0c;看类图有点发虚&#xff01;有些关系搞的不是很清楚。所以整理一下&#xff1a; 类与类之间由弱到强关系是: 没关系 > 依赖 > 关联 > 聚合 > 组合。 类和类之间八竿子打不着那就是没关系&#xff0c;这个没啥歧义。 依赖(dependenc…

Mybatis解决jdbc编程的问题以及mybatis与hibernate的不同

Mybatis解决jdbc编程的问题: 1、 数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能&#xff0c;如果使用数据库连接池可解决此问题。 解决&#xff1a;在SqlMapConfig.xml中配置数据连接池&#xff0c;使用连接池管理数据库链接。 2、 Sql语句写在代码中造成代码不…

Mybatis中Mapper动态代理方式

文章目录开发规范Mapper接口开发需要遵循以下规范Mapper.xml(映射文件)UserMapper(接口文件)加载UserMapper.xml文件总结selectOne和selectList:namespace:开发规范 Mapper接口开发方法只需要程序员编写Mapper接口&#xff08;相当于Dao接口&#xff09;&#xff0c;由Mybatis…

数据结构实验之数组二:稀疏矩阵

题目描述 对于一个n*n的稀疏矩阵M(1 < n < 1000)&#xff0c;采用三元组顺序表存储表示&#xff0c;查找从键盘输入的某个非零数据是否在稀疏矩阵中&#xff0c;如果存在则输出OK&#xff0c;不存在则输出ERROR。稀疏矩阵示例图如下&#xff1a; 输入 连续输入多组数据…

Mybatis中SqlMapConfig.xml配置文件的使用

文章目录SqlMapConfig.xml中配置的内容和顺序如下properties&#xff08;属性)SqlMapConfig.xml引用如下typeAliases&#xff08;类型别名)mybatis支持别名&#xff1a;自定义别名mappers&#xff08;映射器)Mapper引入映射器的几种方法:1.通过resource属性引入classpath路径的…