项目马上切java8了,之前对于java8的东西都是东打一棒西打一锤的了解了些。这次搜集整理了下,从lambda到stream相关的API等。

1.Lambda和匿名内部类

Lambda 是一个匿名的函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递),我一直都认为它就是匿名内部类的变种进化。

匿名内部类:

//匿名内部类
Runnable runnable1 = new Runnable() {@Overridepublic void run() {System.out.println("匿名内部类");}};

Lambda表达式:

//lambda表达式Runnable runnable2 = () -> System.out.println("lambda");

2.Lambda语法:

Lambda 表达式在Java 语言中引入了一个新的语法元素和操作符。这个操作符为 “->”,将表达式分成两部分,左边是参数体,右边是Lambda体,需要函数式接口(接口中只有一个抽象方法的接口,称为函数式接口) 的支持,可以使用注解 @FunctionalInterface 修饰

几种语法格式:

其中:

  只有一个参数,可以省略小括号

  Lambda体只有一条语句可以省略{}

  参数类型可以省略,编译器可以通过上下文推断参数类型

        //无参无返回/大括号省略Runnable runnable3 = () -> System.out.println("lambda");//有参无返回/小括号省略Consumer<String> consumer = (args) -> System.out.println(args);Consumer<String> consumer2 = args -> System.out.println(args);//有参有返回值/参数类型省略Function<Integer, Integer> function = x -> x + 1;Function<Integer, Integer> function1 = (Integer x) -> x + 1;//lambda体内正常逻辑操作Function<Integer, Integer> function3 = (Integer x) -> {if(x < 100) {return x;}return x + 1;};

3. java8 内置函数式接口(java.util.function包)

主要分为四种类型(主要就是对应几种方法类型,有参无返回,无参有返回,有参有返回) Consumer<T> : 消费型接口     void accept(T t);

 Supplier<T> : 供应型接口 T get();

 Function<T, R> : 功能型接口 R apply(T t);

 Predicate<T> : 断言型接口 boolean test(T t);

其他的几乎都是在这四种类型上面进行的扩展,比如 DoubleConsumer 指定了参数类型是double,void accept(double value); ,而Consumer的参数类型是泛型 void accept(T t);,再比如BiFunction和Function相比就是入参变成了两个R apply(T t);,R apply(T t, U u);

4.Lambda语法的另外一种形式 --- 方法引用

若 Lambda 体中的功能,已经有方法提供了实现,可以使用方法引用,前提是接口抽象方法的参数和已经有方法的参数一致,表现形式如下:

1. 对象实例::实例方法名

2. 类名::静态方法名

3. 类名::实例方法名

注意: 第三种表现形式需要Lambda 的参数列表的第一个参数,是实例方法的调用者,第二个参数(或无参)是实例方法的参数时,格式:ClassName::MethodName

        Student student = new Student(101, "张三", 18, 95);Supplier<String> sup = () -> student.getName();System.out.println(sup.get());//对象实例::实例方法名 同上sup = student::getName;System.out.println(sup.get());Comparator<Integer> com = (x, y) -> Integer.compare(x, y);//类名::静态方法名 同上Comparator<Integer> com1 = Integer::compare;//类名::实例方法名 第一个参数是Student实例 lambda体调用Student的show方法ClassName::MethodNameFunction<Student, String> fun = Student::show;System.out.println(fun.apply(student));

5.Lambda语法的另外一种形式 --- 构造器引用

构造器的参数列表,需要与函数式接口中方法参数列表保持一致

表现形式:类名::new

数组引用:函数式接口中方法参数是新数组的长度

表现形式:类型[]::new

        //构造器引用Function<String, Student> fun1 = Student::new;Function<Integer, String[]> fun2 = (args) -> new String[args];String[] strs = fun2.apply(2);System.out.println(strs.length);//数组引用 效果同上Function<Integer, Student[]> fun3 = Student[]::new;Student[] students = fun3.apply(20);System.out.println(students.length);

Student代码:

    private int id;private String name;private int age;private double score;public Student(String name) {this.name = name;}public Student(int id, String name, int age, double score) {this.id = id;this.name = name;this.age = age;this.score = score;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public double getScore() {return score;}public void setScore(double score) {this.score = score;}public String show() {return "测试方法引用";}

转载于:https://www.cnblogs.com/nijunyang/p/11333511.html

java8(1)--- lambda相关推荐

  1. java8新特性(1)--- lambda表达式

    java8新特性(1)- lambda表达式 函数式编程,简化开发 新增语法(->) package com.common.jdk8;// 试想,如果在jdk1.7中,我们要实现基于这个接口的加 ...

  2. Java8新特性(一)-Lambda表达式

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/hhq12/article/detail ...

  3. Java-函数式编程(二)Lambda表达式

    本文首发: Java-函数式编程(二)Lambda表达式 "Lambda 表达式"(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直 ...

  4. JAVA高级(一)——lambda

    JAVA高级(一)--lambda lambda基础 1.是什么是函数是接口? 2.lambda的特点 3.在哪里以及如何使用Lambda lambda实现:环绕执行模式 1.行为参数化 2.使用函数 ...

  5. java8新特性(2)-Lambda表达式

    一:官方定义 Lambda 表达式 − Lambda允许把函数作为一个方法的参数(函数)作为参数传递进方法中. 该表达式的目的是:优化我们的代码,使我们的代码更加的简洁. 举例说明: //使用java ...

  6. Java8 Lambda表达式(三)Lambda表达式与Stream API

    目录 1 Stream基本概念 1.1 什么是Stream 1.2 Stream的特点 2 Stream API初体验 2.1 构造数据 2.1 使用for循环实现 2.2 使用Lambda表达式结合 ...

  7. Java8新特性(一)—————Lambda表达式

    关注微信公众号[行走在代码行的寻路人]获取Java学习视频及资料. 简述Java8中的新特性: 1.速度快:两个对象比较,采用红黑树替换了链表,使其速度变快新增的速度比较与链表较慢 2.新增Lambd ...

  8. JDK8_新特性_详细总结+代码(1)Lambda表达式

    Java 是第一大编程语言和开发平台.它有助于企业降低成本.缩短开发周期.推动创新以及改善应用服务.如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机,Java 仍是企业和开发人员的首选 ...

  9. (3)lambda与函数式——响应式Spring的道法术器

    本系列文章索引:<响应式Spring的道法术器> 前情提要: 什么是响应式编程 | 响应式流 本文源码 1.3 Hello,reactive world 前面两篇文章介绍了响应式编程和响应 ...

最新文章

  1. Windows下安装XAMPP,Wordpress
  2. bash: 无法为立即文档创建临时文件: 权限不够_世界顶级Linux大牛耗时三年总结出3000页Linux文档...
  3. java axis2 jar_Java axis2.jar包详解及缺少jar包错误分析
  4. 【多线程】1.条件变量--std::condition_variable
  5. Spring中BeanPostProcessors后置处理器到底在哪里拦截
  6. SELECT 与 SET 对变量赋值的区别(存储过程)
  7. android uri db,Android ContentProvider封装数据库和文件读写总结
  8. C#设计模式之9-装饰者模式
  9. 为什么Go比Java快这么多?看完这个例子就懂!
  10. 01 springboot 2入门之hello springboot 2(maven构建springboot)
  11. 视频《博客三人行》Windows7让Vista沦为“WindowsMe”
  12. hivesql 列转行,并用逗号分隔
  13. sl400上面安装ubuntu
  14. 飞思卡尔智能车准备篇
  15. 大学计算机培训策划书,大学计划书的范文
  16. 计算机 蓝牙鼠标卡顿,蓝牙鼠标卡顿不流畅怎么办 最新win10无线鼠标卡顿解决办法...
  17. 使用Python爬取豆瓣电影 Top 250
  18. 小程序的WXML WXSS
  19. [Eigen中文文档] 切片和索引
  20. 简练网软考知识点整理-项目整体绩效测量基准

热门文章

  1. android usb存储固定,如何在Android 10中设置默认USB行为
  2. java esc_java – Swing:当按下ESC键时如何关闭对话框?
  3. html5中地理位置,Chrome中的HTML 5地理位置提示
  4. Java JDBC c3p0
  5. 4.5 面部验证与二分类
  6. 3.6 Batch Norm 为什么奏效?
  7. pencv candy边缘检测
  8. [小心][注意][请转发]请检查你环境中的SSD磁盘!
  9. Nginx学习总结(3)——Nginx配置及应用场景之高级配置
  10. Mysql学习总结(32)——MySQL分页技术详解