Java基础语法-Lambda表达式
1.Lambda表达式主要用于简写接口的操作等出现匿名内部类的地方,如下:我这里先定义一个Swim接口,以及它所定义的swim()方法
interface Swim{ void swim(); }
2.定义一个类Person操作这个接口:
class Person implements Swim{ @Override public void swim() { System.out.println("人会游泳"); } }
3.在我的主类TestLambda中测试该接口:
public class TestLambda {private static void show(Swim swim){ swim.swim(); } public static void main(String[] args) { // 简单的对接口的操作 show(new Person()); show(new Swim() { @Override public void swim() { System.out.println("不知道是谁会游泳"); } }); show(()-> System.out.println("不知道是谁,也不知道它(他)会干什么");//当然我们通过Lambda看不出来操作了那个接口,但编译程序是知道的
相同原理的里一个例子(对应上面例子的三种方法):
String[] s = {"Justin","Monic","Irene"}; //第一种方法:构建操作接口的类 class MyComparator implements Comparator<String>{ @Override public int compare(String o1, String o2) { return o1.length()-o2.length(); } } Comparator<String> comparator3 = new MyComparator();//创建类操作接口并实例化该类 Arrays.sort(s,comparator2); //第二种方法:匿名化接口的操作 Arrays.sort(s, new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.length()-o2.length(); } }); //第三种方法:lambda Arrays.sort(s,(o1, o2) ->{return o1.length()-o2.length();});//只有一条语句时{}可省略并且return也可省略。Lambda表达式中,当没有参数传入时,()时不可以省略的,只有一个参数传入时,()可以省略,两个两个以上的参数传入时,()不可以省略
Lambda中的方法参考:
1.还是先以Swim接口的操作为例:
首先我们在TestLambda类中写入一下方法
static void classSwim(){ System.out.println("不知道是谁,也不知道它(他)会干什么"); }
在mian()方法中操作接口:
show(()->TestLambda.classSwim());//等同于show(TestLambda::classSwim);
2.以Arrays.sort()方法为例:
首先我们在TestLambda类中写入一下方法:
static int bylength(String o1,String o2){ return o1.length()-o2.length(); }
在mian()方法中操作接口:
Arrays.sort(s,(o1, o2) -> TestLambda.bylength(o1,o2)); Arrays.sort(s, TestLambda::bylength);//参考TextLambda,bylength方法
另外,如果参考方法的方法体中,只是调用了传入参数的类型的类类的某个方法,可写作:
//TestLambda类中的一个静态方法 static int byLength(String o1,String o2){ return o1.compareTo(o2);//该静态方法只是调用了String的compareTo()方法 }//mian()方法中: //Lambda本来可写为一下: Arrays.sort(s, TestLambda::byLength); //也可写作: Arrays.sort(s,String::compareTo);
方法参考总结:当一个静态方法与操作接口的方法具有相同的参数类型参数个数以及返回值时,可以使用该静态方法代替操作接口的方法
特定对象的方法参考:
先以Swim接口为例:
//TestLambad中写入如下方法 void clasSwim2(){ System.out.println("我是classSwim2,我被classSwim调用"); //main()方法中: show(()->new TestLambda().clasSwim2());//等同于 TestLambda testLambda = new TestLambda(); show(testLambda::clasSwim2);
然后再看List类的forEach()方法
//out是printStream实例 //s接上面例子 List<String> list = Arrays.asList(s); list.forEach(new Consumer<String>() { @Override public void accept(String s) { System.out.println(s);//调用out实例的println()方法 } }); //等同于 list.forEach(System.out::println);
关于接口:
default修饰接口中的方法表示,操作该接口的类可以选择不操作default修饰的方法。
(1). 如果父接口中有个默认方法,子接口中再度声明与父接口默认方法相同的方法命名,但没有写default也就是没有方法操作,那么子接口中该方法直接重新定义了父类中的默认方法操作为抽象方法。 (2). 如果两个接口都定义了相同方法命名的默认方法,而新的接口同时继承这两个接口,那么会引发冲突,当新的接口没有重新定义方法时,就会发生变异错误,解决途径就是明确重新定义方法或者可使用接口.super.方法的方式指定继承的那个接口的方法。(3)如果类操作两个接口拥有相同的父接口,其中一个重新定义了父接口的默认方法而另一个没有,那么操作类将采用重新定义的版本。(4)如果子类继承父类同时操作了某接口,而父类中的方法与接口中的默认方法具有相同的方法命名,则采用父类的方法定义。
另外JDK8除了让接口可以定义默认方法以外,也开始允许在接口中定义静态方法,此方法要写方法体,调用和类中的静态方法调用相似。
Java基础语法-Lambda表达式的更多相关文章
- Java基础教程——Lambda表达式
Lambda表达式 Java8引入Lambda表达式,可以使代码更简洁. 格式:参数,箭头,代码 (参数名)->{代码} Lambda表达式体现了"函数式编程思想"-- 面向 ...
- 033 01 Android 零基础入门 01 Java基础语法 03 Java运算符 13 运算符和表达式知识点总结
033 01 Android 零基础入门 01 Java基础语法 03 Java运算符 13 运算符和表达式知识点总结 本文知识点:运算符和表达式知识点总结 前面学习的几篇文都是运算符和表达式相关的知 ...
- Java 终于有 Lambda 表达式啦~Java 8 语言变化——Lambda 表达式和接口类更改【转载】
原文地址 en cn 下载 Demo Java™ 8 包含一些重要的新的语言功能,为您提供了构建程序的更简单方式.Lambda 表达式 为内联代码块定义一种新语法,其灵活性与匿名内部类一样,但样板文件 ...
- java基础语法要点<二>(基于1.8)
注解(元数据) 从jdk5 开始,java支持在源文件中嵌入补充信息,称为注释(annotation).注释不会改变程序的动作,也就不会改变程序的语义.但在开发和部署期间,各种工具可以使用这类信息.元 ...
- java面向对象编程——第二章 java基础语法
第二章 java基础语法 1. java关键字 abstract boolean break byte case catch char class const continue default do ...
- java 8 中lambda表达式学习
转自 http://blog.csdn.net/renfufei/article/details/24600507 http://www.jdon.com/idea/java/10-example-o ...
- Java基础语法(上篇)
Java基础语法(上篇) 知识概要: (1)关键字的表示与规范 (2)标示符 (3)注释 (4 ...
- Lambda 表达式,Java中应用Lambda 表达式
一.Lambda 表达式 简单来说,编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数. 链接:知乎 先举一个普通的 Python 例 ...
- Java基础语法入门01
Java基础语法入门01 学习java你要先进行去了解JDK,JRE,JVM JDK Java开发工具包 JRE Java语言开发的运行环境 JVM Java虚拟机,用于Java语言的跨平台所用. 当 ...
随机推荐
- Hibernate 配置文件的基础配置
Hibernate 配置文件主要用于配置数据库连接和 Hibernate运行时所需的各种属性 每个 Hibernate 配置文件对应一个 Configuration 对象 Hibernate.cfg. ...
- Hadoop错误之namenode宕机的数据恢复
情景再现: 在修复hadoop集群某一个datanode无法启动的问题时,搜到有一个答案说要删除hdfs-site.xml中dfs.data.dir属性所配置的目录,再重新单独启动该datanode即 ...
- python文档测试
def average(values): """ compute average value >>> print(average([20, 30, 10 ...
- Codechef August Challenge 2018 : Safe Partition
传送门 (虽然是A了但是不知道复杂度是不是正确的 考虑以某个位置为结尾的合法划分 先考虑min,带来的影响是限制了最小长度,预处理出这个最小长度后,这可以在处理到这个数时,把不能算的部分去掉(不满足m ...
- __x__(35)0908第五天__ 层级 z-index
如果三个 div 全部设置 position: absolute; 绝对定位,且未设置 z-index, 则从代码结构上 下面的元素 会盖住 上面的元素. z-index 层级: 通过 z-i ...
- php发送短信验证码
业务: 手机端点击发送验证码,请求发送到php端,由php调用榛子云短信http://smsow.zhenzikj.com的短信接口,生成验证码并发送. SDK下载: http://smsow.zhe ...
- CentOS启动docker1.13失败(Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.)
一.启动失败 1.启动docker [root@localhost ~]# systemctl start docker Job for docker.service failed because t ...
- Asch PK Lisk系列之一:安全性
在币圈,听到对数字货币的质疑之声从来没少过.为什么有人会质疑呢?他们列出了很多理由(以下四点内容摘自网络): 数字货币是依附于网络的,而中国并没有独立自主的网络技术,容易被敌对势力利用数字货币损害中国 ...
- 前言|Elena
2019.3.19更新置顶 2018.11.5更新置顶 2018.9.7更新置顶 -这里写下置顶- 嗨嗨嗨 这里AlenaNuna,偏远小渔村oi蒟蒻一只,各大题库id有Elena/AlenaNuna ...
- ASP.NET Core 2.2 迁移至 3.0 备忘录
将 ASP.NET Core 2.2 迁移至 ASP.NET Core 3.0 需要注意的地方记录在这篇随笔中. TargetFramework 改为 netcoreapp3.0 <Target ...