java8特性之Lambda表达式
1.典型的用Lambda表达式的场景
如果有这样的一个小应用,其中的一个类Student包含姓名(name),性别(sex),分数(score),如下:
package demo; public class Student {
public enum Sex {
MALE,FEMALE
} private String name;
private Sex gender;
private int age;
private double score; public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student(String name, Sex gender, int age, double score) {
super();
this.name = name;
this.gender = gender;
this.age = age;
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Sex getGender() {
return gender;
}
public void setGender(Sex gender) {
this.gender = gender;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
} public void printStudent() {
System.out.println("学生姓名:"+this.name);
System.out.println("学生年龄:"+this.age);
System.out.println("学生性别:"+this.gender);
System.out.println("学生成绩:"+this.score);
} }
假设创建的学生类都放在一个Student的ArrayList<Student>,现如今我们要实现这样的一个功能,输入age,筛选出年龄大于age的学生。这非常简单:
(1) 创建一个方法寻找符合条件的Student对象:
public void printStudnetOlderThan(int age) {
for(Student stu:studentList) {
if (stu.getAge()>age) {
stu.printStudent();
}
}
}
这种方法会使你的application变得非常脆弱,如果你的需求要进行修改,比如筛选出成年人,成绩优秀的,等等,那么你将会重写很多的代码,而且代码将会显得很混乱,给代码的阅读带来不便。
(2) 将筛选条件写在一个独立的类中。
package demo; public interface CheckStudent {
public boolean test(Student stu); } package demo; public class CheckStudentForOlder implements CheckStudent { @Override
public boolean test(Student stu) {
if (stu.getAge()>18) return true;
return false;
} }
public void printStudnetOlderThan(CheckStudent tester) {
for (Student stu:studentList) {
if(tester.test(stu)) {
stu.printStudent();
}
}
}
这样就不会出现printStudentOlderThan函数因为筛选条件的改变,而重写多次。但是缺点也是显而易见的你必须为你的每一个筛选条件都创建一个继承CheckStudnet的类,虽然这样代码是比第一中方法更加有条理,但还是显得很臃肿。
(3)创建匿名类
mock.printStudnetOlderThan(new CheckStudent() { @Override
public boolean test(Student stu) {
if (stu.getAge()>18) return true;
return false;
} });
这运用了java匿名对象的特性,相比于上一种创建大量筛选类的方法来说,已经帮我们节省了大量创建类的繁琐代码。但是给人的感觉不是很好,代码的功能并不是很明显。
(4)利用Lambda表达式
这个CheckStudent接口是一个function interface(只有一个抽象方法),因此你可以在继承它时,省略掉这个方法的名字,你可以使用Lambda表达式
mock.printStudnetOlderThan((Student p)->p.getAge()>20);
(5) 使用一个标准的Function Interfaces 用于Lambda表达式
JDK定义了几个标准Function Interfaces(只包含一个抽象方法),你可以在 java.util.function
.中找到他。
这样就可以避免创建一个接口了。
public void printStudnetOlderThan(Predicate<Student> tester) {
for (Student stu:studentList) {
if(tester.test(stu)) {
stu.printStudent();
}
}
} //调用上面的函数
mock.printStudnetOlderThan((Student p)->p.getAge()>20);
(6) 使用Consumer<T>来优化代码
我们可以根据上面的代码使得筛选条件可以用Lambda表达式快速的更换,使得程序更加健壮,但是如果在满足筛选条件时,我们想执行的不是printStudent方法,而是其他方法呢?这时,Consumer就可以帮助我们解决这个问题了。
public void printStudnetOlderThan(Predicate<Student> tester,Consumer<Student> block) {
for (Student stu:studentList) {
if(tester.test(stu)) {
block.accept(stu);
}
}
} //调用
mock.printStudnetOlderThan((Student p)->p.getAge()>20,
p->p.printStudent());
2.Lambda表达式的语法:
(1) 一个带有()用”,”分割的参数列表,你可以省略参数的数据类型。另外如果只有一 个参数你也可以省略掉括号
(2) 箭头符号:->
(3) 用单个表达式或语句块组成的主体。这里需注意如果是语句块要用{}括起来。
3.Target Typing
你怎么样确定一个Lambda 表达式的类型。在上面的例子中我们在方法中调用Lambda表达式,分别用了 Function Interface ,Predicate,Consumer,我们还可以用Function,
只有在java的编译器可以通过上下文找到Lambda表达式的Target Type,你才可以使用Lambda表达式。
java8特性之Lambda表达式的更多相关文章
- java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合
java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合 比如,我有一张表: entity Category.java service CategoryServic ...
- Java8 新特性学习 Lambda表达式 和 Stream 用法案例
Java8 新特性学习 Lambda表达式 和 Stream 用法案例 学习参考文章: https://www.cnblogs.com/coprince/p/8692972.html 1.使用lamb ...
- 夯实Java基础(二十二)——Java8新特性之Lambda表达式
1.前言 Java 8于14年发布到现在已经有5年时间了,经过时间的磨练,毫无疑问,Java 8是继Java 5(发布于2004年)之后的又一个非常最重要的版本.因为Java 8里面出现了非常多新的特 ...
- java8的新特性之lambda表达式和方法引用
1.1. Lambda表达式 通过具体的实例去体会lambda表达式对于我们代码的简化,其实我们不去深究他的底层原理和背景,仅仅从用法上去理解,关注两方面: lambda表达式是Java8的一个语法糖 ...
- Java8学习笔记----Lambda表达式 (转)
Java8学习笔记----Lambda表达式 天锦 2014-03-24 16:43:30 发表于:ATA之家 本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘.因为本人 ...
- JAVA8学习——深入浅出Lambda表达式(学习过程)
JAVA8学习--深入浅出Lambda表达式(学习过程) lambda表达式: 我们为什么要用lambda表达式 在JAVA中,我们无法将函数作为参数传递给一个方法,也无法声明返回一个函数的方法. 在 ...
- Java8特性之Lambda、方法引用以及Stream流
Java 8 中的 Streams API 详解:https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/ Java笔记——Jav ...
- java8:(Lambda 表达式简介)
JDK8的新特性——Lambda表达式 JDK8已经发布快4年的时间了,现在来谈它的新特性显得略微的有点“不合时宜”.尽管JDK8已不再“新”,但它的重要特性之一——Lambda表达式依然是不被大部分 ...
- Java8新特性之Lambda表达式
lambda表达式是java8给我们带来的几个重量级新特性之一,借用lambda表达式,可以让我们的java程序设计更加简洁.最近新的项目摒弃了1.6的版本,全面基于java8进行开发,本文是java ...
随机推荐
- fgetc()
fgetc() 函数从文件指针中读取一个字符.
- spark读写Sequoiadb
spark如何读写Sequoiadb,最近被客户问多了,这个记录下. Spark读Sequoiadb数据: package marketing import com.sequoiadb.hadoop. ...
- Hadoop权威指南文摘
第1章 初识Hadoop 1.1 数据!数据! 1.2 数据的存储与分析 HDFS实现数据的存储,MapReduce实现数据额分析与处理 1.3 相较于其他系统的优势 MapReduce是一个批量查询 ...
- java 集合综述(总结于多位博友)
http://www.cnblogs.com/shunran/p/3459065.html(good) java集合类主要负责保存.盛装其他数据,因此集合类也称容器类. java集合类分为:set.l ...
- 使用word 2007 发布csdn博客
目前大部分的博客作者在写博客这件事情上都会遇到以下3个痛点:1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.2.发布到博客或公众号平台 ...
- up7.1-asp.net-本地测试教程
1.1. ASP.NET 框架:.NET Framework 4.5 依赖库:csredis,Newtonsoft.Json 安装redis 下载 redis-x64:http://pan.bai ...
- (二)ASP.NET中JavaScript的中英文(多语言)实现方案(二)
在ASP.NET中JavaScript的中英文(多语言)实现方案中简单的介绍了js实现多语言的一种方案.下面将要讲述另外一种方法,尽管很相似,但是有些地方也是需要细细琢磨的,不说了,先看看. 在Lan ...
- linux vi vim文本编辑器
vim是vi的加强版,建议使用vim. vim拥有三种模式: 命令模式(常规模式) vim启动后,默认进入命令模式,任何模式都可以通过esc键来回到命令模式.命令模式可以通过键入不同的命令来完成选择, ...
- delphi实现截全屏功能
procedure TForm1.Button10Click(Sender: TObject);var bmp: TBitmap; can: TCanvas; dc: HDC; Image1: TIm ...
- Linq研究
微软在.NET 3.5中加入了LINQ技术,作为配套改进了C#语言,加入了Lambda表达式,扩展方法,匿名类型等新特性用以支持LINQ.微软同时提出了要使用声明式编程,即描述计算规则,而不是描述计算 ...