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表达式的更多相关文章

  1. Kotlin语法(函数和lambda表达式)

    三.函数和lambda表达式 1. 函数声明 fun double(x: Int): Int { } 函数参数是用 Pascal 符号定义的 name:type.参数之间用逗号隔开,每个参数必须指明类 ...

  2. Lambda表达式的语法格式

    Lambda表达式的语法格式: 参数列表 => 语句或语句块 “Lambda表达式”是委托的实现方法,所以必须遵循以下规则: 1)“Lambda表达式”的参数数量必须和“委托”的参数数量相同: ...

  3. Lambda表达式 简介 语法 示例

    Lambda 表达式也称为闭包,是匿名类的简短形式.Lambda 表达式简化了[单一抽象方法声明接口]的使用,因此 lambda 表达式也称为功能接口. 在 Java SE 7 中,单一方法接口可使用 ...

  4. 1.2 lambda 表达式的语法

    1.2 lambda 表达式的语法 还以上一节中的排序为例.我们传递代码来检查某个字符串的长度是否小于另一个字符串的长度,如下所示: Integer.compare(first.length(), s ...

  5. JDK8新特性02 Lambda表达式02_Lambda语法规则

    //函数式接口:只有一个抽象方法的接口称为函数式接口. 可以使用注解 @FunctionalInterface 修饰 @FunctionalInterface public interface MyF ...

  6. Lambda表达式 简介 语法 示例 匿名内部类

    在AS中使用 Lambda 表达式 Demo地址:https://github.com/baiqiantao/MultiTypeTest.git Gradle(Project级别)中添加classpa ...

  7. 【Java8新特性】Lambda表达式基础语法,都在这儿了!!

    写在前面 前面积极响应读者的需求,写了两篇Java新特性的文章.有小伙伴留言说:感觉Lambda表达式很强大啊!一行代码就能够搞定那么多功能!我想学习下Lambda表达式的语法,可以吗?我的回答是:没 ...

  8. Java 终于有 Lambda 表达式啦~Java 8 语言变化——Lambda 表达式和接口类更改【转载】

    原文地址 en cn 下载 Demo Java™ 8 包含一些重要的新的语言功能,为您提供了构建程序的更简单方式.Lambda 表达式 为内联代码块定义一种新语法,其灵活性与匿名内部类一样,但样板文件 ...

  9. 死磕Lambda表达式(一):初识Lambda

    弱小和无知不是生存的障碍,傲慢才是.--<三体> 什么是Lambda表达式 Lambda表达式是表示可传递匿名函数的一种简洁方式,Lambda表达式没有名称,但是有参数列表.函数主体.返回 ...

随机推荐

  1. Mac os下profile设置

    Mac os环境下home目录下是没有profile文件的开启终端后,读取的是/etc/profile文件因为个人喜欢使用ll命令,mac默认并没有这个命令,所以使用如下方法设置别名 cp -rp / ...

  2. 20140322 卡迪夫城VS利物浦,拔出重剑,有惊无险

    一.菱形442 起初在客战南安普顿的时候,罗杰斯启用了菱形442阵式,阵容和今天客战卡迪夫城几乎一样,只是格伦·约翰逊打左后卫,弗拉纳甘任职右后卫,目的是为了在客场抵御卢克·肖+拉拉纳.当时库蒂尼奥的 ...

  3. IntelliJ IDEA 2017.3-2018.1 全系列汉化包

    JetBrains 系列软件汉化包 关键字: Android Studio 3.0-3.1 汉化包 GoLand 2017.3.2-2018.1 汉化包 IntelliJ IDEA 2017.3-20 ...

  4. 优化器,sgd,adam等

    https://zhuanlan.zhihu.com/p/32230623 首先定义:待优化参数:  ,目标函数:  ,初始学习率 . 而后,开始进行迭代优化.在每个epoch  : 计算目标函数关于 ...

  5. stixel上边缘

    上图是2^x-1的曲线,取值范围在(-1,正无穷) 上面两个公式组成了隶属函数(membership)表示隶属度,隶属度就是衡量这个点同下边缘点是否属于同一个物体.实际上M函数就是2^x-1,但M函数 ...

  6. Jupyter Notebook 设置黑色背景主题、字体大小、代码自动补全

    1.背景主题.字体大小设置 安装Jupyter主题: pip install jupyterthemes 然后,更新Jupyter主题: pip install --upgrade jupyterth ...

  7. Pandas快速入门(深度学习入门2)

    源地址为:http://pandas.pydata.org/pandas-docs/stable/10min.html#min Pandas(Python Data Analysis Library) ...

  8. ListView 中嵌套 GridView

    1.主布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andr ...

  9. HDU 1028 Ignatius and the Princess III 整数的划分问题(打表或者记忆化搜索)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1028 Ignatius and the Princess III Time Limit: 2000/1 ...

  10. 【SQLSERVER学习笔记】进攻式编程

    一般的编程语言建议是进行防御式编程,在开始处理之前先检查所有参数的合法性.但实际上,对数据库编程而言,尽量同时做几件事情的进攻式编程有切实的优势.*/ --我们SP中常见的防御式编程示例:--场景一: ...