20155335俞昆《java程序设计》第七周总结
学号 2016-2017-2 《Java程序设计》第X周学习总结
## 教材学习内容总结
Lambda 的语法概览
String[] names={“Justin”,”caterpillar”,”bush”}
Array.sort(names,new Comparator<string>(){
Public int compare(String name1,String name2) {
Return name1.length()-name2.length;
});
Arrays的sort访法可以用来排序,只不过,必须知道两个元素的比较顺序,sort()规定要操作java.Util.Compatator来说明这件事。
通过变量bylength,确实是让排序意图清楚许多,只是操作匿名类时依旧冗长,例如,声明byLength时已经写了一次Compatator<string>,匿名类操作时又要写一次Compatator<string>可以写为
Compatator<string>byLength=(String name1,String name2)-.>name1.length()-name2.length();
重复的Compatator<String>信息从等号右边去除了,原本的匿名类方法只有一个要操作,使用Lamaba表达式时,实际上从等号左边Compatator<string>声明就可以知道,Lamba表达式实际上要操作Compatator<string>中的Compare()方法,还有重复的信息,既然声明变量使用了Compatator<string>,为什么Lamba表达式参数上又得声明一次String?实际上却是不用,因为编译程序可以从byLength变量的声明类型,推断name1和name2的类型,可以在简化为
Compatator<string> bylength=(name1,name2)->name1.length-name2.length();
可以将它直接放到Array的sort方法中去。
编译程序可以从names推断,sort()方法的第二个参数类型实际上就是Compatator<string>,因而name1和name2还是不用声明类型,跟一开始匿名类写法相比较,程序代码却是简洁许多。
如果许多地方都会有按字符串长度排序的需求,可以这样用。遇到在同一个方法内,就像之前用的byname局部变量,如果类中同一个方法间要共享,用一个byname数据成员,因为byname要参考的数据变量没有状态问题,因而声明为static比较适合,如果再多个类实现共享,设定为public static 例如
Package cc。openhome
Import. java.Util.Arrays;
Public class StrinfOrderDemo{
Public static void main(String[] args){
String[] names={“Justin”,”caterpillar”,”Bush”};
Arrays.sort(names,StringOrder::byLength);
System.out.peintIn(Arrays.toString(names));
}
}
除了方法名称之外,bylength方法签署了与Compatator的Compare方法相同,你只在Lamba表达式将参数是s1和s2传给bylength方法,可以直接重用bylength方法的操作不是更好吗?
在java中引入lamba的同时,与现有API维持兼容性的主要考虑之一。方法参考特性
在java中引入Lamba的同时,与现有API维持兼容性是主要考虑。重用现有方法操作,可以避免到处写下Lamba表达式。上面的例子是运用了方法参考的一种形式,也就是参考现有的static方法。
现在看另一个需求,如果按字典顺序排序名称?因为已经定义了StringOrder,这么撰写
String[] names={“Justin”,”caterpillar”,”bush”};
Arrays.sort(names,StringOrder::byLexicography);
StringOrder的byLexicography()方法操作中,只不过将调用String的ComparTo方法,就是将参数s1作为compareTo的接受者,第二个参数s2作为compare()的参数,在这种情况下,其实我们可以直接参考String类的compareTo方法,例如
import java.util.Arrays;
public class StringDemo{
public static void main (String[] args){
String[] names={"justin","caterpillar","bush"};
Arrays.sort(names,String::compareTo);
System.out.printIn(Array.toString(names));
}
}
类似的,想对名称按照字典顺序排序,但忽略大小写差异,也不用通过StringOrder的static方法了,只需参考String中的compareToIgnoreCase方法:
String[] names={“Justin”,”caterpillar”,”bush”};
Array.sort(names,String::compareToIgnoreCase);
可轻易的观察到,方法参考不仅可以避免重复撰写Lamdba表达式,也可以让程序代码更为清楚。这边只是初尝以下Lamdba的甜头,关于Lamdba还有更多细节,后续会再注意探讨。
Lamdba表达式
已知以下程序代码,
Comparator<string> byLength =
(String name1,String name2)->name1.length()-name2.length();
可以拆开为两部分,等号右边是lamdba表达式,等号左边是作为lamdba表达式的目标类型,看看等号右边的lamdba表达式:
(String name1,String name2)->name1.length()-name2.length();
这个Lamdba表达式表示接受两个参数name1和name2,参数都是String类型,目前右边定义了会返回结果的单一表达式,如果运算比较复杂,必须使用多行描述,可以加入{}定义描述区块。如果有返回值,必须加上return,例如:
(String name1,String name2)->{
String name1=name1.trim();
String name2=name2.trim();
…
Return name1.Length()-name2.Length();
}
Lambda表达式中,即使不接受任何参数,也必须写下括号。例如;
()—>”Justin”//不接受任何参数,返回字符串
()—>System.out.printIn()//不接受参数,没有返回值
在只有Lamdba表达式下,参数类型必须写出来,如果有目标类型的话,在编译程序可推断出类型的情况下,就可以不用写出Lanbda表达式的参数类型,实际上是String,因而就不用写出参数类型。
Compatator<string>byLength=(name1,name2)—>name1.length()-name2.length();
Lamdba的表达式本身是中性的,不代表任何类型的实例,同样的Lambda的表达式,可用来表示不同目标类型的操作对象,举例而言,上面的范例用来表示Compparator<string>操作。
尽量简单的总结一下本周学习内容
尽量不要抄书,浪费时间
看懂就过,看不懂,学习有心得的记一下
## 教材学习中的问题和解决过程
- 问题1:XXXXXX
- 问题1解决方案:XXXXXX
- 问题2:XXXXXX
- 问题2解决方案:XXXXXX
- ...
## 代码调试中的问题和解决过程
- 问题1:XXXXXX
- 问题1解决方案:XXXXXX
- 问题2:XXXXXX
- 问题2解决方案:XXXXXX
- ...
## [代码托管](码云学习项目链接)
http://git.oschina.net/tianmaxingkomg/xinjianxianmu
(statistics.sh脚本的运行结果截图)
## 上周考试错题总结
- 错题1及原因,理解情况
- 错题2及原因,理解情况
- ...
## 结对及互评
### 评分标准
1. 正确使用Markdown语法(加1分):
- 不使用Markdown不加分
- 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
- 排版混乱的不加分
2. 模板
20155335俞昆《java程序设计》第七周总结的更多相关文章
- 201521123027 <java程序设计>第七周学习总结
1.本周学习总结 2.书面作业 Q1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 答: 源代码: //contains()方法 public boolean c ...
- 20155335俞昆《Java程序设计》第五周总结
# 20155335 <Java程序设计>第五周学习总结 ## 教材学习内容总结 ## 教材学习中的问题和解决过程 对于异常处理,程序中总有意想不到的状况所引发的的错误,Jav ...
- 20155335俞昆《java程序设计》第三周总结
20155335 2006-2007-2 <Java程序设计>第三周学习总结 ## 教材学习内容总结 首先,关键是区基本类型和类类型,,产生对象必须定义类,类是一个概念,并不存在,对 ...
- 20155335 俞昆 2016-2017-2 《Java程序设计》第九周学习总结
学号 2016-2017-2 <Java程序设计>第九周学习总结 ##JDBC入门 在正式介绍JDBC前,已知JDBC是用来执行SQL的解决方案,开发人员使用JDBC的标准接口,开发人员不 ...
- 201871010106-丁宣元 《面向对象程序设计(java)》第七周学习总结
201871010106-丁宣元 <面向对象程序设计(java)>第七周学习总结 正文开头: 项目 内容 这个作业属于哪个课程 https://home.cnblogs.com/u/nwn ...
- 20145213《Java程序设计》第九周学习总结
20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...
- 21045308刘昊阳 《Java程序设计》第九周学习总结
21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...
- 20145236 《Java程序设计》第九周学习总结
20145236 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API ...
- 20155304田宜楠2006-2007-2 《Java程序设计》第一周学习总结
20155304田宜楠2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 - 浏览教材,根据自己的理解每章提出一个问题 第一章 除了书上提到的开发工具还有什么适合 ...
- 20155303 2016-2017-2 《Java程序设计》第二周学习总结
20155303 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 『注意』 "//"为单行批注符: "/*"与&quo ...
随机推荐
- sqlserver查询---分配cpu等资源
数据库资源按需分配 https://www.cnblogs.com/i6first/p/4138365.html https://blog.csdn.net/kk185800961/article/d ...
- jsp访问java变量
jsp页面中javascript访问 java的变量 <%= JAVA变量名%> jsp中嵌入java代码<%java代码%> --变量<% String JAVASOu ...
- as3 air 获取文件夹下的所有文件
private function getFile(directory:File) { var files:Array = directory.getDirectoryListing(); for(va ...
- LVS原理以及配置
安装好ipvsadm后需要查看内核是否加载了ip_vs模块儿,如果没有需要手动执行ipvsadm进行加载: # ipvsadm # lsmod |grep ip_vs # rmmod ip_vs_rr ...
- oc 中的id类型与类型转换
id是oc语言中一个独特的数据类型.一种通用对象类型.可以转换为任何数据类型,即id类型的变量可以存放任何数据类型的对象. 使用示例: Animal * dog = [[Dog alloc]init] ...
- iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 错误处理
沪江CCtalk视频地址:https://www.cctalk.com/v/15114923887518 处理错误请求 爱能遮掩一切过错. 当我们在访问一个站点的时候,如果访问的地址不存在(404), ...
- SmartOS技术常见问题
什么是默认用户名和密码? 当SmartOS Live Image第一次启动时,系统将提示您设置root密码. 如果在不导入Zpool的情况下启动SmartOS,则需要默认的root密码. 当使用noi ...
- select 1 与 select null (转)
1.Select 1 在这里我主要讨论的有以下几个select 语句: table表是一个数据表,假设表的行数为10行,以下同. 1:select 1 from table 2:select cou ...
- 处理程序“pagehandlerfactory-integrated"在其模块列表中有一个错误模块
解决方案 管用员权限进入cmd命令提示符界面,执行命令"cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319", 运行: aspne ...
- np.identity()
二.np.identity()这个函数和之前的区别在于,这个只能创建方阵,也就是N=M 函数的原型:np.identity(n,dtype=None) 参数:n,int型表示的是输出的矩阵的行数和列数 ...