java基础知识-lambda表达式
一.什么是lambda?
在Java中,我们可以将一个值赋值给一个Java变量。
int aValue = 129;
String aString = "hello world";
Boolean aBoolean = true;
但是,我们可以将一块代码或者一个方法赋值给一个Java变量么(类似于javascript那样给方法取名字)?
aMethodOfCode = public void doSomething(String s){System.out.println(s);}
以上操作,在Java8之前是不能做到的,在8之后,使用lambda表达式的特性,就可以做的到了。但是上面的代码还是太过于冗余,不够“优雅”,所以java做了一些优化。
- 1.public 是多余的: aMethodOfCode = void doSomething(String s){System.out.println(s);}
- 2.函数名称doSomething是多余的,因为函数名称已经赋值给了aMethodOfCode,并不需要原本的函数名称了:aMethodOfCode = void (String s){System.out.println(s);}
- 3.返回值是多余的,因为我们在代码里会写是否有返回值,编译器可以自己判断是否有返回值以及返回值的类型:aMethodOfCode = (String s) {System.out.println(s);}
- 4.参数是多余的,你给定什么参数,编译器会自己判断: aMethodOfCode= (s){System.out.println(s);}
- 5.大括号是如果在只有一行代码的情况下,是多余的: aMthodOfCode = (s)System.out.println(s)
- 6.感觉直接这样写有点太丑,需要其他的东西,那就在参数和方法体之间加入一个->,表示这个参数传入到这个方法体里面执行:aMethodOfCode = (s) -> System.out.println(s);
Lambda表达式有什么用?
经过以上的操作,我们就把一个方法传递给了一个变量,但是Java是一门强类型的语言,那么这个变量应该是一个什么类型的呢? 即如何声明这个变量的类型?在Java8之中,所有的Lambda的类型都是一个接口!而我们上面写的lambda表达式本身,是一个接口的具体实现,也就是说,我们的代码,实际上是一个具体的接口实现,只不过我们没有和之前一样定义一个class显示的实现,在java8之前,这样的操作我们可以通过实现接口,或者匿名内部类两种方式,例如一个排序操作:
/**
* 声明一个学生容器,现在要按照学生的id顺序,
*/
public class LambdaTest {
public static void main(String [] args){
List<Student> list = new ArrayList<>();
list.add(new Student(1,"张三"));
list.add(new Student(2,"李四"));
//现在要对list里面的内容进行排序,按照id的大小顺序排序,使用Collections.sort方法
//1. 使用自定义的compare类(见下面),实现compare方法
Collections.sort(list,new MyCompare());
//2. 使用匿名内部类
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
if (o1.getId()==o2.getId()) return 0;
return o1.getId()>o2.getId()?1:-1;
}
});
//3.使用lambda表达式
Collections.sort(list,(s1,s2)-> Integer.compare(s1.getId(),s2.getId()));
}
}
//第一中方法自己实现的compare方法
class MyCompare implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
//如果id相等就认为相等,否则按照id顺序大小排序
if (o1.getId()==o2.getId()) return 0;
return o1.getId()>o2.getId()?1:-1;
}
}
//学生pojo
class Student {
private int id ;
private String name;
public Student(int id, String name) {
this.id = id;
this.name = name;
}
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;
}
}
以上的例子,是最简单的lambda表达式的使用方法,但也是最常用的lambda表达式使用方法, 可以极大的简化代码的冗余,好处就不用多说了。
3.Lambda表达式要注意的几个点
- 什么样的接口我可以用lambda表达式?随便一个接口都可以么?
JDK8之后,有一个注解为FunctionalInterface,表明的意义就是,该接口是一个函数式接口。在jdk8之后的Callable,Runnable,Comparator之中,都可以看见这个注解。可以见另一篇关于该注解的文章。
这个问题的答案我们暂时看来是yes,我们接着继续往下走。
public class LambdaTest2 {
//定义方法,使用到自定义的接口
public static void methodOne(String s , MyInterface myInterface){
myInterface.doSomething(s);
}
public static void main(String [] args){
//使用lambda表达式操作
methodOne("string",(s)->System.out.println(s));
}
}
interface MyInterface{
void doSomething(String s);
}
- 接口能否有多个抽象方法,如果有,lambda怎么确定实现的是什么方法?
lambda表达式是用来简化接口的方法实现的,在不需要匿名内部类的情况下,实现一个方法。同时他也不指定方法名,那么多抽象方法的接口能使用lambda表达式么?

如图可以看到,我们在加了注解的接口之上,写入多个抽象方法的时候,编译器会报错,即该注解只能单个抽象方法(不包含有默认实现的方法)。如果不加这个注解呢?我们知道不加注解,依然可以实现lambda表达式。让我们试一下。

我们可以看到,编译器会报错的,报错的原因其实也很简单,如果要使用这个接口的对象,那么你就要实现这个接口的所有方法,而lambda表达式只是实现了其中的一个,自然是不能使用的。
结语
目前只是讨论了lambda表达式的开始,之后会更加深入一点理解。
java基础知识-lambda表达式的更多相关文章
- JAVA基础知识|lambda与stream
lambda与stream是java8中比较重要两个新特性,lambda表达式采用一种简洁的语法定义代码块,允许我们将行为传递到函数中.之前我们想将行为传递到函数中,仅有的选择是使用匿名内部类,现在我 ...
- C#基础知识---Lambda表达式
一.Lambda表达式简介 Lambda表达式可以理解为匿名函数,可以包含表达式和语句.它提供了一种便利的形式来创建委托. Lambda表达式使用这个运算符--- "=>", ...
- Java基础教程——Lambda表达式
Lambda表达式 Java8引入Lambda表达式,可以使代码更简洁. 格式:参数,箭头,代码 (参数名)->{代码} Lambda表达式体现了"函数式编程思想"-- 面向 ...
- Java基础语法-Lambda表达式
1.Lambda表达式主要用于简写接口的操作等出现匿名内部类的地方,如下:我这里先定义一个Swim接口,以及它所定义的swim()方法 interface Swim{ void swim(); } 2 ...
- 沉淀,再出发:Java基础知识汇总
沉淀,再出发:Java基础知识汇总 一.前言 不管走得多远,基础知识是最重要的,这些知识就是建造一座座高楼大厦的基石和钢筋水泥.对于Java这门包含了编程方方面面的语言,有着太多的基础知识了,从最初的 ...
- Java 8中Lambda表达式默认方法的模板方法模式,你够了解么?
为了以更简单的术语描述模板方法,考虑这个场景:假设在一个工作流系统中,为了完成任务,有4个任务必须以给定的执行顺序执行.在这4个任务中,不同工作流系统的实现可以根据自身情况自定义任务的执行内容. 模板 ...
- Java基础知识(壹)
写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...
- java基础知识小总结【转】
java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...
- Java 基础知识(一)
Java基础知识篇: 一.关键字解释 1. final:修饰非抽象类,非抽象方法和属性, 以及修饰方法参数,代表“无法改变的”.出于对设计或者效率的考虑使用该关键字. final类无法被继承,fina ...
- java 基础知识二 基本类型与运算符
java 基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ...
随机推荐
- Python中的super函数,你熟吗?
摘要:经常有朋友问,学 Python 面向对象时,翻阅别人代码,会发现一个 super() 函数,那这个函数的作用到底是什么? 本文分享自华为云社区<Python中的super函数怎么学,怎么解 ...
- 树莓派学习笔记 (1) - 安装&初始设置
1. 设备 Raspberry Pi 4B MicorSD card (tf 卡) Windows 10 电脑 Android 手机 2. 烧录系统 利用官网提供的 Raspberry Pi Imag ...
- JAVA SE 基础总结
§ 基础知识 一.程序组织与运行原理 1.1 程序组织 一个 JAVA 程序文件中主要由如下几部分构成: package 声明 public 类:public 类与类文件名相同,因为其是作为该类文件唯 ...
- 第六章:Django 综合篇 - 6:会话session
因为因特网HTTP协议的特性,每一次来自于用户浏览器的请求(request)都是无状态的.独立的.通俗地说,就是无法保存用户状态,后台服务器根本就不知道当前请求和以前及以后请求是否来自同一用户.对于静 ...
- Kafka QuickStart
环境版本 操作系统:CentOS release 6.6 (Final) java版本: jdk1.8 kafka 版本: kafka_2.11-1.1.1.tgz 安装kafka 1. 下载压缩包, ...
- 谣言检测——(PSA)《Probing Spurious Correlations in Popular Event-Based Rumor Detection Benchmarks》
论文信息 论文标题:Probing Spurious Correlations in Popular Event-Based Rumor Detection Benchmarks论文作者:Jiayin ...
- PAT (Basic Level) Practice 1012 数字分类 分数 20
给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字: A1 = 能被 5 整除的数字中所有偶数的和: A2 = 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 n1−n ...
- 请推荐下比较适合中小企业的ERP系统,如odoo,除前期开发和不定期完善,有没有其他固定月费或年费?
odoo的话你自己就可以下载开源的安装使用的啊,如果你要别人帮你开发和完善做技术服务的话一般都还是要年费的,主要是因为要帮你做维护或修bug什么的,自己能搞定的话自然不需要的哦.只是odoo使用的是p ...
- Python(一)转义字符及操作符
转义字符 描述 \(在行尾时) 续航符 \\ 反斜杠符号 \' 单引号 \'' 双引号 \a 响铃 \b 退格(Backspace) \e 转义 \000 空 \n 转行 \v 纵向制表符 \t 横向 ...
- java.lang.Object类与equals()及toString()的使用
1.Object类是所有Java类的根父类 2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类 3.Object类中的功能(属性.方法)就具有通用 ...