java8(1)--- lambda
项目马上切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相关推荐
- java8新特性(1)--- lambda表达式
java8新特性(1)- lambda表达式 函数式编程,简化开发 新增语法(->) package com.common.jdk8;// 试想,如果在jdk1.7中,我们要实现基于这个接口的加 ...
- Java8新特性(一)-Lambda表达式
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/hhq12/article/detail ...
- Java-函数式编程(二)Lambda表达式
本文首发: Java-函数式编程(二)Lambda表达式 "Lambda 表达式"(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直 ...
- JAVA高级(一)——lambda
JAVA高级(一)--lambda lambda基础 1.是什么是函数是接口? 2.lambda的特点 3.在哪里以及如何使用Lambda lambda实现:环绕执行模式 1.行为参数化 2.使用函数 ...
- java8新特性(2)-Lambda表达式
一:官方定义 Lambda 表达式 − Lambda允许把函数作为一个方法的参数(函数)作为参数传递进方法中. 该表达式的目的是:优化我们的代码,使我们的代码更加的简洁. 举例说明: //使用java ...
- Java8 Lambda表达式(三)Lambda表达式与Stream API
目录 1 Stream基本概念 1.1 什么是Stream 1.2 Stream的特点 2 Stream API初体验 2.1 构造数据 2.1 使用for循环实现 2.2 使用Lambda表达式结合 ...
- Java8新特性(一)—————Lambda表达式
关注微信公众号[行走在代码行的寻路人]获取Java学习视频及资料. 简述Java8中的新特性: 1.速度快:两个对象比较,采用红黑树替换了链表,使其速度变快新增的速度比较与链表较慢 2.新增Lambd ...
- JDK8_新特性_详细总结+代码(1)Lambda表达式
Java 是第一大编程语言和开发平台.它有助于企业降低成本.缩短开发周期.推动创新以及改善应用服务.如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机,Java 仍是企业和开发人员的首选 ...
- (3)lambda与函数式——响应式Spring的道法术器
本系列文章索引:<响应式Spring的道法术器> 前情提要: 什么是响应式编程 | 响应式流 本文源码 1.3 Hello,reactive world 前面两篇文章介绍了响应式编程和响应 ...
最新文章
- Windows下安装XAMPP,Wordpress
- bash: 无法为立即文档创建临时文件: 权限不够_世界顶级Linux大牛耗时三年总结出3000页Linux文档...
- java axis2 jar_Java axis2.jar包详解及缺少jar包错误分析
- 【多线程】1.条件变量--std::condition_variable
- Spring中BeanPostProcessors后置处理器到底在哪里拦截
- SELECT 与 SET 对变量赋值的区别(存储过程)
- android uri db,Android ContentProvider封装数据库和文件读写总结
- C#设计模式之9-装饰者模式
- 为什么Go比Java快这么多?看完这个例子就懂!
- 01 springboot 2入门之hello springboot 2(maven构建springboot)
- 视频《博客三人行》Windows7让Vista沦为“WindowsMe”
- hivesql 列转行,并用逗号分隔
- sl400上面安装ubuntu
- 飞思卡尔智能车准备篇
- 大学计算机培训策划书,大学计划书的范文
- 计算机 蓝牙鼠标卡顿,蓝牙鼠标卡顿不流畅怎么办 最新win10无线鼠标卡顿解决办法...
- 使用Python爬取豆瓣电影 Top 250
- 小程序的WXML WXSS
- [Eigen中文文档] 切片和索引
- 简练网软考知识点整理-项目整体绩效测量基准
热门文章
- android usb存储固定,如何在Android 10中设置默认USB行为
- java esc_java – Swing:当按下ESC键时如何关闭对话框?
- html5中地理位置,Chrome中的HTML 5地理位置提示
- Java JDBC c3p0
- 4.5 面部验证与二分类
- 3.6 Batch Norm 为什么奏效?
- pencv candy边缘检测
- [小心][注意][请转发]请检查你环境中的SSD磁盘!
- Nginx学习总结(3)——Nginx配置及应用场景之高级配置
- Mysql学习总结(32)——MySQL分页技术详解