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. JavaScrip File类拓展

    ##今天在做jsp的文件上传功能,想着上传文件后在当前页面把选取的文件信息展现出来,查来查去,发现了js中的file类,之前在w3c和runboob盯了好久找找不到....不过终于还是在网上查到了这个 ...

  2. NET平台微服务

    .NET平台微服务项目汇集   最近博客园出现了一篇文章<微服务时代之2017年五军之战:Net PHP谁先死>,掀起了一波撕逼,作者只是从一个使用者的角度来指点江山,这个姿势是不对的.. ...

  3. Eclipse Ctrl + Shift + O in IntelliJ IDEA

    In Eclipse, you press CTRL + SHIFT + O “Organize Imports” to import packages automatically. For Inte ...

  4. ST表学习总结

    前段时间做16年多校联合赛的Contest 1的D题(HDU 5726)时候遇到了多次查询指定区间的gcd值的问题,疑惑于用什么样的方式进行处理,最后上网查到了ST表,开始弄得晕头转向,后来才慢慢找到 ...

  5. Nginx卸载重装问题

    1.删除nginx,-purge包括配置文件 sudo apt-get --purge remove nginx   2.移除全部不使用的软件包 sudo apt-get autoremove   3 ...

  6. Netty问题小结

    1.问题:高并发时连接不够:java.net.SocketException: No buffer space available (maximum connections reached?): co ...

  7. MongoDB的角色作用(2)

    数据压力大到机器支撑不了的时候能否做到自动扩展? 在系统早期,数据量还小的时候不会引起太大的问题,但是随着数据量持续增多,后续迟早会出现一台机器硬件瓶颈问题的.而MongoDB主打的就是海量数据架构, ...

  8. firefox下载文件弹出框之终极解决方案-vbs模拟键盘操作

    由于近期一直被firefox的保存文件弹出框困扰,摸索尝试过几种方法,已有的方法可以跑通但是对对效果不太满意,因此一直在寻找合适的解决办法. 最近发现了也可以通过VBS来处理弹出框,速度也不错,其原理 ...

  9. About Me - 关于

    0x00 简介 97年生 计算机相关专业,无线电安全攻防方向. 涉猎较多,喜欢研究无线.硬件.软件.网络.攻击.检测.防御等各类安全技术 精通较少,主要擅长的还是硬件.渗透.无线攻击方面. 现阶段在研 ...

  10. CF1066CBooks Queries(数组的特殊处理)

    题意描述 您需要维护一个数据结构,支持以下三种操作: L id:在现在序列的左边插一个编号为id的物品 R id:在现在序列的右边插一个编号为id的物品 ? id:查询该点左面有几个元素,右面有几个元 ...