Lambda表达式的语法与如何使用Lambda表达式
Lambda表达式是对象,是一个函数式接口的实例
如何来写Lambda表达式?
- 看参数
- 看返回值
代码实例1:
package day2; import jdk.nashorn.internal.codegen.CompilerConstants; import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.function.Function;
import java.util.function.UnaryOperator; /**
* @auther hhh
* @date 2018/12/27 21:32
* @description
*/
public class LambdaExpress {
/**
* Lambda 表达式语法:
* args -> expr (左边是参数,右边是表达式)
* 或者 (Object...args )->{函数式接口抽象方法的实现逻辑}
* ()里面参数的个数,根据函数式接口里面的抽象方法的参数个数来决定
* 只有一个参数的时候,()可以省略
* 当expr逻辑非常简单的时候,{}和return都可以省略
*/
/**
* 表达式示例:
* () -> {} //无参,无返回值
* () -> {System.out.println(1);} //无参,无返回值
* () -> System.out.println(1)//无参,无返回值,上面的简写,将{}省略
* () -> {return 100;} //无参有返回值
* () -> return 100; // 无参又返回值
* () -> null ; //无参又返回值,返回null
* (int x) -> {return x+1;} //单参,有返回值
* (int x) -> return x+1;
* (x) -> x+1 //单参,又返回值(不指定参数类型,多个参数必须用括号)
* x -> x+1 //单参数,有返回值(不指定参数类型)
*/
/**
* 注意事项:(以下实现是错误的)
* (x,int y) -> x+y (不能部分省略)
* (x,final y) -> x+y (参数不能使用final修饰符)
* Object o = () -> "hello" (不能将Lambda表达式赋值给一个非函数式接口)
* Object obj = (Supplier<?>)() ->"hello" (不需要也不允许使用throws语句来声明他可能会抛出的异常)
*/
public static void main(String[] args) throws Exception {
//语法:LambdaParameters -> LambdaBody (返回值必须是函数式接口)
Runnable r1 = () -> System.out.println("r1");
Runnable r5 = () -> {
System.out.println("r5");
};
//不是用lambda表达式
Runnable r4 = new Runnable() {
@Override
public void run() {
System.out.println("r4");
}
};
r1.run();
r4.run();
Runnable r2 = null;
Runnable r3 = () -> {
}; Callable<String> call1 = new Callable<String>() {
@Override
public String call() throws Exception {
return "不适用lambda";
}
};
Callable<String> call2 = () -> {
return "使用lambda;";
};
Callable<String> call3 = () -> "使用lambda简化,不需要人return与{}";
//call2 中的call方法是在函数式接口中实现的
System.out.println(call1.call() + "===" + call2.call() + "===" + call3.call()); UserMapper userMapper = new UserMapper() {
@Override
public void insert(User user) {
System.out.println(" insert user");
}
};
UserMapper u2 = (User user) -> System.out.println("use lambda insert user");
userMapper.insert(new User());
u2.insert(new User());
OrderMapper orderMapper = new OrderMapper() {
@Override
public int insert(Order order) {
return 1;
}
};
OrderMapper o1 = (Order order) -> 1;
OrderMapper o2 = (order) -> {
return 1;
};
OrderMapper o3 = (Order order) -> {
return 1;
};
//省略参数类型
OrderMapper o4 = (order) -> 1; //Function<T,R> 代表一个输入一个输出,一般输入输出是不同类型
Function<Integer, Integer> f1 = (a) -> {
int sum = 0;
for (int i = 1; i <= a; i++) {
sum += i;
}
return sum;
};
//UnaryOperator<T> 继承自Function<T,R>一般输入输出是同种类型,因为输入输出是同种类型,所以之传了一个参数,省略输出类型
UnaryOperator<Integer> unaryOperator = (a) -> {
int sum = 0;
for (int i = 0; i < a; i++) {
sum += a;
}
return sum;
};
System.out.println("sum = " + f1.apply(10));
System.out.println("sum = " + unaryOperator.apply(10));
//尝试使用for循环进行遍历
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
UnaryOperator<List<Integer>> unaryOperator2 = (l) -> {
for (Integer i : list) {
list.set(i - 1, i + 1);
}
return list;
};
System.out.println(unaryOperator2.apply(list));
}
} interface UserMapper {
void insert(User user);
} class User {
} interface OrderMapper {
int insert(Order order);
} class Order {
}
代码实例2:
package day2; import javax.sound.midi.Soundbank; /**
* @auther hhh
* @date 2018/12/27 22:32
* @description
*/
public class LambdaExpre2 {
static int get() {
System.out.println(1);
return 1;
} static void set() {
} static String find() {
return "";
} public static void main(String[] args) throws Exception {
/**
* 方法的返回值不是一定会返回,具体是有函数式接口的抽象方法决定的
* 实现的函数式接口没有返回值,调用的方法的值就不会被返回
* Runnable 中方法的实现为 public abstract void run(); 没有返回值
* 函数式接口只管执行方法,不管没有有返回值
*/
//Runnable 调用自定义的方法不会报错,但是Runnable方法为什么不报错呢?
Runnable r1 = () -> get();
Runnable r2 = () -> set();
// Runnable r3 = () -> 100; 不行,因为在Runnable实现的抽象方法中没有返回值,强制返回报错 r1.run();//无输出,说明值没有被返回 //Fun方法在调用set()的时候会报错,是因为Fun中定义的get()方法需要有返回值,而set()方法没有返回值
Fun f1 = () -> get();
System.out.println(f1.get());
Fun f2 = () -> 100;
Fun f3 = () -> 1 > 5 ? 1 : -1;
Fun f4 = () -> true ? 1 : -1;
// Fun f2 = () -> set();
// Fun f3 = () -> find();返回值类型必须一致
}
} interface Fun {
int get();
}
package day2; import javax.sound.midi.Soundbank; /**
* @auther hhh
* @date 2018/12/27 22:32
* @description
*/
public class LambdaExpre2 {
static int get() {
System.out.println(1);
return 1;
} static void set() {
} static String find() {
return "";
} public static void main(String[] args) throws Exception {
/**
* 方法的返回值不是一定会返回,具体是有函数式接口的抽象方法决定的
* 实现的函数式接口没有返回值,调用的方法的值就不会被返回
* Runnable 中方法的实现为 public abstract void run(); 没有返回值
* 函数式接口只管执行方法,不管没有有返回值
*/
//Runnable 调用自定义的方法不会报错,但是Runnable方法为什么不报错呢?
Runnable r1 = () -> get();
Runnable r2 = () -> set();
// Runnable r3 = () -> 100; 不行,因为在Runnable实现的抽象方法中没有返回值,强制返回报错 r1.run();//无输出,说明值没有被返回 //Fun方法在调用set()的时候会报错,是因为Fun中定义的get()方法需要有返回值,而set()方法没有返回值
Fun f1 = () -> get();
System.out.println(f1.get());
Fun f2 = () -> 100;
Fun f3 = () -> 1 > 5 ? 1 : -1;
Fun f4 = () -> true ? 1 : -1;
// Fun f2 = () -> set();
// Fun f3 = () -> find();返回值类型必须一致
}
} interface Fun {
int get();
}
代码实例3:
package day2; import java.util.function.BiFunction;
import java.util.function.Function; /**
* @auther hhh
* @date 2018/12/27 22:50
* @description
*/
public class BiFuncationTest {
public static void main(String[] args) {
//写任何函数式接口(Lambda)先把格式写好,重点是方法参数与返回值
//BiFunction<T, U, R> b = (参数,因为有两个输入参数,()一定不能省略)->{执行方法,若方法直接返回课省略{}};
//BiFunction 代表两个输入一个输出
BiFunction<String, String, Integer> biFunction = (a, b) -> a.length() + b.length();
System.out.println(biFunction.apply("sadfasdf", "fasdfsdaf"));
BiFunction<Integer, Integer, String> biFunction2 = (a, b) -> {
//编写具体代码逻辑
return "";
};
//输入String,输出Integer
Function<String, Integer> function = a -> a.length();
}
}
package day2; import java.util.function.BiFunction;
import java.util.function.Function; /**
* @auther hhh
* @date 2018/12/27 22:50
* @description
*/
public class BiFuncationTest {
public static void main(String[] args) {
//写任何函数式接口(Lambda)先把格式写好,重点是方法参数与返回值
//BiFunction<T, U, R> b = (参数,因为有两个输入参数,()一定不能省略)->{执行方法,若方法直接返回课省略{}};
//BiFunction 代表两个输入一个输出
BiFunction<String, String, Integer> biFunction = (a, b) -> a.length() + b.length();
System.out.println(biFunction.apply("sadfasdf", "fasdfsdaf"));
BiFunction<Integer, Integer, String> biFunction2 = (a, b) -> {
//编写具体代码逻辑
return "";
};
//输入String,输出Integer
Function<String, Integer> function = a -> a.length();
}
}
Lambda表达式的语法与如何使用Lambda表达式的更多相关文章
- Kotlin语法(函数和lambda表达式)
三.函数和lambda表达式 1. 函数声明 fun double(x: Int): Int { } 函数参数是用 Pascal 符号定义的 name:type.参数之间用逗号隔开,每个参数必须指明类 ...
- Lambda表达式的语法格式
Lambda表达式的语法格式: 参数列表 => 语句或语句块 “Lambda表达式”是委托的实现方法,所以必须遵循以下规则: 1)“Lambda表达式”的参数数量必须和“委托”的参数数量相同: ...
- Lambda表达式 简介 语法 示例
Lambda 表达式也称为闭包,是匿名类的简短形式.Lambda 表达式简化了[单一抽象方法声明接口]的使用,因此 lambda 表达式也称为功能接口. 在 Java SE 7 中,单一方法接口可使用 ...
- 1.2 lambda 表达式的语法
1.2 lambda 表达式的语法 还以上一节中的排序为例.我们传递代码来检查某个字符串的长度是否小于另一个字符串的长度,如下所示: Integer.compare(first.length(), s ...
- JDK8新特性02 Lambda表达式02_Lambda语法规则
//函数式接口:只有一个抽象方法的接口称为函数式接口. 可以使用注解 @FunctionalInterface 修饰 @FunctionalInterface public interface MyF ...
- Lambda表达式 简介 语法 示例 匿名内部类
在AS中使用 Lambda 表达式 Demo地址:https://github.com/baiqiantao/MultiTypeTest.git Gradle(Project级别)中添加classpa ...
- 【Java8新特性】Lambda表达式基础语法,都在这儿了!!
写在前面 前面积极响应读者的需求,写了两篇Java新特性的文章.有小伙伴留言说:感觉Lambda表达式很强大啊!一行代码就能够搞定那么多功能!我想学习下Lambda表达式的语法,可以吗?我的回答是:没 ...
- Java 终于有 Lambda 表达式啦~Java 8 语言变化——Lambda 表达式和接口类更改【转载】
原文地址 en cn 下载 Demo Java™ 8 包含一些重要的新的语言功能,为您提供了构建程序的更简单方式.Lambda 表达式 为内联代码块定义一种新语法,其灵活性与匿名内部类一样,但样板文件 ...
- 死磕Lambda表达式(一):初识Lambda
弱小和无知不是生存的障碍,傲慢才是.--<三体> 什么是Lambda表达式 Lambda表达式是表示可传递匿名函数的一种简洁方式,Lambda表达式没有名称,但是有参数列表.函数主体.返回 ...
随机推荐
- 移动端fixed的元素抖动的问题
工作中发现,给一个元素添加fixed属性,让它固定在窗口某个位置,直接加fposition:fixed属性就能实现这个效果: 在安卓手机上的效果都比较好,但是ios系统的个别浏览器兼容性就不好,如QQ ...
- 在Node中使用ES7新特征——async、await
async与await两个关键字是在ES7中添加的新特征,旨在更加直观的书写异步函数,避免出现callback hell. callback hell是什么? readFileContents(&qu ...
- Django CreateView 简单使用
django.views.generic中的CreateView类,是基于View的子类.CreateView可以简单快速的创建表对象. 下面记录小作代码. # polls/views.py from ...
- 安装MySql-Python遇到的错误及解决方法
用pip安装mysql-python时报错: _mysql.c _mysql.c(42) : fatal error C1083: Cannot open include file: 'config- ...
- BZOJ1924:[SDOI2010]所驼门王的宝藏(强连通分量,拓扑排序)
Description Input 第一行给出三个正整数 N, R, C. 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室 ...
- [19/03/27-星期三] 容器_Iterator(迭代器)之遍历容器元素(List/Set/Map)&Collections工具类
一.概念 迭代器为我们提供了统一的遍历容器的方式 /* *迭代器遍历 * */ package cn.sxt.collection; import java.security.KeyStore.Ent ...
- Selenium基础知识(8大元素定位概说)
1. By.name() 页面源码如下: [html] : <button id="gbqfba"aria-label="Google Search" n ...
- springboot——我的第一个工程
前言:使用Spring Boot 微服务架构有一段时间了,打算从今天开始记录使用过程. 一.Spring Boot介绍: 简介:Spring Boot 框架的产生,是为了方便我们简化Spring 框架 ...
- 二. Python WebDriver环境搭建
1. 安装Selenium 在命令行中输入: 显示安装成功: 2. 测试例子 打开百度页面并在输入框输入搜索内容(默认为firework) # 1. Selenium默认为Firefox.验证 fro ...
- Filter实现字符集统一设置
Filter实现字符集统一设置 其实是对request和response请求进行了拦截 1.创建Filter类,实现javax.Servlet接口 doFilter方法 //设置字符集 request ...