一提到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

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

java8新特性lambda表达式、函数式编程、方法引用和接口默认方法以及内部类访问外部变量相关推荐

  1. Java8新特性----Lambda表达式详细探讨

    Java8新特性 Lambda表达式 入门演示 案例1 如何解决 cannot be cast to java.lang.Comparable问题? 案例2 优化方式一 : 策略设计模式 优化方式二: ...

  2. java8新特性-lambda表达式入门学习

    定义 jdk8发布新特性中,lambda是一大亮点之一.lambda表达式能够简化我们对数据的操作,减少代码量,大大提升我们的开发效率.Lambda 表达式"(lambda expressi ...

  3. java8新特性lambda表达式概述

    定义 ​ jdk8发布新特性中,lambda是一大亮点之一.lambda表达式能够简化我们对数据的操作,减少代码量,大大提升我们的开发效率.Lambda 表达式"(lambda expres ...

  4. 【Java】Java8新特性Lambda表达式和Stream API

    Lambda表达式是实现支持函数式编程技术的基础. 函数式编程与面向对象编程:函数式编程将程序代码看作数学中的函数,函数本身作为另一个函数参数或返回值,即高阶函数.而面向对象编程按照真实世界客观事物的 ...

  5. Java8 新特性 -- Lambda表达式:函数式接口、方法的默认实现和静态方法、方法引用、注解、类型推测、Optional类、Stream类、调用JavaScript、Base64

    文章目录 1. Lambda表达式 1.1 Lambda表达式语法 1.2 Lambda表达式示例 1.3 说明:函数式接口 2. 方法的默认实现和静态方法 3. 方法引用 3.1 方法引用示例 4. ...

  6. java compare 返回值_关于Java你不知道的那些事之Java8新特性[Lambda表达式和函数式接口]...

    前言 为什么要用Lambda表达式? Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码,将代码像数据一样传递,这样可以写出更简洁.更灵活的代码,作为一个更紧凑的代码风 ...

  7. Java8新特性——lambda表达式

    什么是lambda表达式? Lambda 表达式是Java 8 的新特性,是一种新的编程语法.lambda语义简洁明了,性能良好,是Java 8 的一大亮点.废话不多说,我们来看个例子. 从内部类到l ...

  8. Java8 新特性lambda表达式(一)初始

    本篇参考Richard Warburton的 java8 Lambdas :Functional Programming for the Masses 学习lambda表达式之前,需要知道什么是函数式 ...

  9. 2020.10.20课堂笔记(java8新特性 lambda表达式)

    一.什么是Lambda? 我们知道,对于一个Java变量,我们可以赋给其一个"值". 如果你想把"一块代码"赋给一个Java变量,应该怎么做呢? 比如,我想把右 ...

最新文章

  1. 南方科技大学宋毅课题组招聘启事
  2. .NET 4.5 Task异步编程学习资料
  3. js处理富文本编辑器转义、去除转义、去除HTML标签
  4. MYSQL的replace into
  5. 多重索引DataFrame插入数据的方法探索
  6. SetDll把Dll文件注入到.exe应用程序中
  7. 1990-2000年事务处理流程图和数据流图试题分析
  8. Java基础:基础加强巩固
  9. JSP指令:page指令,errorPage和isErrorPage
  10. HP P2000 G3阵列故障经历
  11. WebStorm自定义主题/护眼主题
  12. Vue自定义组件——图片放大器,js点击<img>触发图片放大,富文本内图片点击实现放大器效果
  13. 如何批量生成ISBN条码
  14. 实验六 视图的创建与管理
  15. 笔记本显卡和台式显卡区别介绍
  16. 深度自定义macOS邮件程序的个性签名内容
  17. Ubantu安装成功后重启时出现please remove the installation medium,then press enter
  18. 解决height:100vh超出屏幕高度的问题
  19. 无法引导Win11卡在GNU GRUB界面
  20. Excel 阅读模式 高亮标记 聚光灯效果 “完美“解决方案

热门文章

  1. AI应用开发基础傻瓜书系列3-损失函数
  2. 现代软件工程 学生阅读和调查作业
  3. 现代软件工程 作业 文本文件中英语单词的频率
  4. JAVA入门级教学之(方法-2)
  5. linux delete内存不下降_linux内存分配管理
  6. exfat最佳单元大小_双动圈四喇叭单元的头戴式耳机,DACOM HF002上手体验
  7. php论坛系统教程,国内php原创论坛
  8. selinux= 为 disabled_安德里茨为巴西KLabin Puma II 项目提供气化炉和生物质处理线
  9. thymealf如何实现传单个变量给html_梦回2013,看尤大vue的第一行代码,如何用30行代码实现vue(超简洁,适合初学者)...
  10. 【LeetCode笔记 - 每日一题】519. 随机翻转矩阵(Java、随机、双指针)