Lamda表达式学习笔记一
Lamda表达式学习笔记一
一、Lamda语法诠释
三傻大闹宝莱坞的主人公兰彻说的一句话让我映像深刻:用简单的语言来表达同样的意
我并不是说书上的定义怎么怎么不对,而是应该理解书本上的定义,并用简单的话语描述!
那么正题来了,lamda表达式是什么?
定义:lamda表达式是一个可传递的代码块,可以在以后执行一次或多次(将代码像数据一样进行传输)。
可传递的代码块?匿名内部类就是一种代码块!
/**
* 普通匿名函数
*/
@Test
public void test() {
Comparator<Integer> comparator = new Comparator<Integer>() {
@Override
public int compare(Integer x, Integer y) {
return Integer.compare(x, y);
}
};
TreeSet<Integer> ts = new TreeSet<>(comparator);
} /**
* lamda表达式
*/
@Test
public void test1() {
Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);
TreeSet<Integer> ts = new TreeSet<>(comparator);
}
证明了lamda语法确实能代替匿名函数,也就意味着lamda表达式需要接口的支持。
需要怎么样的接口来支持lamda表达式呢?这个问题我们后面再说。
二、Lamda语法
分别是
- 参数列表
- lamda符号
- lamda体,接口抽象方法的实现
此处的参数列表是接口中抽象方法的形参,lamda体则是对于接口抽象方法的实现,那我们写lamda表达式用接口中哪一个方法?这个问题,jvm是不知道的,所以我们需要的接口就是只有一个抽象方法的接口
函数式接口:只有一个抽象方法的函数,通常函数式接口用@FunctionInterface来声明
三、lamda表达式的表现形式
lamda表达式的4种形式
无参->无返回值
/**
* 无参->无返回值
*/
@Test
public void test2() {
Runnable runnable = () -> System.out.println("hahahah");
runnable.run();
}
2.无参->有返回值
/**
* 无参->有返回值
*/
@Test
public void test3() {
Supplier<Integer> consumer = () -> 10;
Integer o = consumer.get();
System.out.println(o);
}
3.有参->无返回值
/**
* 有参->无返回值
*/
@Test
public void test4() {
Consumer consumer = (x) -> System.out.println();
consumer.accept("hahahah");
}
4.有参-有返回值
/**
* 有参->有返回值
*/
@Test
public void test5() {
Function<Integer, Integer> function = (x) -> x * x;
System.out.println(function.apply(1000));
}
四、四大内置函数式接口
这四个接口分别是:Consumer<T>,Supplier<T>,Function<T, R>,Predicate<T>
1.Consumer<T> 消费型接口
@FunctionalInterface
public interface Consumer<T> {
void accept(T var1); default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (t) -> {
this.accept(t);
after.accept(t);
};
}
}
2.Supplier<T> 供给型接口
package java.util.function; @FunctionalInterface
public interface Supplier<T> {
T get();
}
3.Function<T, R> 功能型接口
import java.util.Objects; @FunctionalInterface
public interface Function<T, R> {
R apply(T var1); default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
Objects.requireNonNull(before);
return (v) -> {
return this.apply(before.apply(v));
};
} default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (t) -> {
return after.apply(this.apply(t));
};
} static <T> Function<T, T> identity() {
return (t) -> {
return t;
};
}
}
4.Predicate<T> 断言型接口(函数返回值是boolean值)
package java.util.function; import java.util.Objects; @FunctionalInterface
public interface Predicate<T> {
boolean test(T var1); default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> {
return this.test(t) && other.test(t);
};
} default Predicate<T> negate() {
return (t) -> {
return !this.test(t);
};
} default Predicate<T> or(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> {
return this.test(t) || other.test(t);
};
} static <T> Predicate<T> isEqual(Object targetRef) {
return null == targetRef ? Objects::isNull : (object) -> {
return targetRef.equals(object);
};
} static <T> Predicate<T> not(Predicate<? super T> target) {
Objects.requireNonNull(target);
return target.negate();
}
}
不仅仅有这4个函数型接口,java8还为我们提供了
最后针对lamda表达式含有3个地方可以优化
1.当只有一个参数时可以不写小括号
2.当lamda体中只有一条语句时可以不用加大括号
3.参数列表可以不用声明参数类型,jvm会根据上下文来分析数据类型(不需要考虑性能问题,因为不论如何我们的.java代码都会进行编译)
侵删,文章仅供大家交流学习,第一次写文章,有不足之处希望大家多多包涵
参考:https://www.bilibili.com/video/av62117143
Lamda表达式学习笔记一的更多相关文章
- Lamda表达式学习笔记二
Lamda表达式学习笔记二 lamda表达式----方法引用 上一篇讲到Lamda体就是对函数式接口方法的实现 ,在方法体中我们可能会引用其他方法实现逻辑,所以在lamda体中我们可以直接引用器方法 ...
- lamda表达式学习
lamda表达式 “Lambda 表达式”是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型. 格式:( 形参列表 ) => { 函数体 } 所有 Lambda 表达式 ...
- C# Lambda表达式学习笔记
本笔记摘抄自:https://www.cnblogs.com/leslies2/archive/2012/03/22/2389318.html,记录一下学习过程以备后续查用. 一.Lambda ...
- java lambda表达式学习笔记
lambda是函数式编程(FP,functional program),在java8中引入,而C#很早之前就有了.在java中lambda表达式是'->',在C#中是‘=>’. 杜甫说:射 ...
- EL表达式学习笔记
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6684424.html 一:EL表达式的用途 1.获取数据:(某个web域 中的对象,访问javabean的 ...
- lambda 表达式学习笔记
在Java中传递一个代码段并不容易,不能直接传递代码段.Java是一个面向对象语言,所以必须构造一个对象,这个对象的类需要一个方法能包含所需的代码.lambda的出现有效的解决这个问题,让代码变得更加 ...
- 《C++ Primer Plus》第5章 循环和关系表达式 学习笔记
C++提供了3种循环: for 循环. while 循环 和 do while 循环 .如果循环测试条件为 true 或非零,则循环将重复执行一组指令: 如果测试条件为 false 或 0 , 则结束 ...
- Python运算和和表达式 学习笔记
光荣之路Python公开课第二讲 Python运算符和表达式. 一 Python运算符 Python运算符包括 算术运算符,赋值运算符,位运算符,逻辑运算符,身份运算符,成员运算符. 1. 算术运算符 ...
- python函数和lambda表达式学习笔记
1. python函数 不同于其他语言,python支持函数返回多个值 为函数提供说明文档:help(函数名)或者函数名.__doc__ def str_max(str1, str2): ''' 比较 ...
随机推荐
- Java进阶学习(2)之对象交互(下)
访问属性 封闭的访问属性 private等访问权限控制是对类的,这意味着同一类的不同对象可以互相访问其成员 这是从代码层面去考虑的,意味着不同类文件 开放的访问属性 一个类文件就是一个编译单元 pub ...
- C语言与汇编的嵌入式编程:main中模拟函数的调用(两数交换)
编写一个两数交换函数swap,具体代码如下: #include<stdio.h> void swap(int *p1,int *p2) { int temp; temp = *p1; *p ...
- 吴裕雄 python 神经网络——TensorFlow 三层简单神经网络的前向传播算法
import tensorflow as tf w1= tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1)) w2= tf.Variable( ...
- CSS 动画过程及间接实现样式延时
/* 过度动画自动归位 */ @keyframes animation_button_scene { 0% { background: #9cacb4; } 10% { /* 样式过度2 */ } 6 ...
- TOPSIS算法
title: TOPSIS算法 date: 2020-02-24 11:18:06 categories: 数学建模 tags: [评价模型, MATLAB] mathjax: true 定义 C ...
- mysql成功的远程连接
1.在虚拟机上的window7中安装mysql,版本mysql-5.7.27-win32,可以是解压版或者是安装版的, MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的.如果是msi ...
- 移动端rem自适应方案
一般设计师给我们的设计稿尺寸都为750*1340 .. 网易,淘宝移动端首页上html元素的font-size 目前就先说一下网易的做法 引入下面这段js,用于计算动态的font-size (func ...
- IPSec的高可用性技术
IPSec VPN的高可用性技术:①.DPD(Dead Peer Detection)对等体检测 ——旨在检查有问题的IPSec VPN网络,并快速的切换到备 ...
- vue修改当前页样式不影响公共样式的方法
在项目开发中需要对一些标签进行样式修改但是每次修改之后其他页面的样式也会跟着改变, 在网上找了很多方法都不好使后来大神告诉我一种方法很好用分享给大家. 1:首先在template标签下的第一个div中 ...
- TP-LINK路由器端口映射全套教程(亲测有效)
最近想在自己的笔记本上搭建一个博客系统,方便自己写写日志,记录一些知识心得. 由于笔记本是长期放在家里的,需要在外边也能访问它,于是需要在路由器上设置一个端口映射,让在因特网上的其他电脑能访问到家里的 ...