Java中Lambda表达式的使用详解
作者:四季人06 发布时间:2022-01-02 04:52:16
标签:Java,Lambda,表达式
理解函数式接口以及 Lambda表达式的发展过程
任何接口,只包含唯一一个抽象方法,就是函数式接口
/**
* lambdab表达式的发展
*/
public class TestLambda1 {
//3.静态内部类
static class Like2 implements ILike{
@Override
public void lambda() {
System.out.println("i like lambda2");
}
}
public static void main(String[] args) {
ILike like=new Like();
like.lambda();
like=new Like2();
like.lambda();
//4.局部内部类
class Like3 implements ILike{
@Override
public void lambda() {
System.out.println("i like lambda3");
}
}
like=new Like3();
like.lambda();
//5.匿名内部类
like=new ILike() {
@Override
public void lambda() {
System.out.println("i like lambda4");
}
};
like.lambda();
//6.用lambda简化
like=()->{
System.out.println("i like lambda5");
};
like.lambda();
}
}
//1.定义一个函数式接口
interface ILike{
void lambda();
}
//2.实现类
class Like implements ILike{
@Override
public void lambda() {
System.out.println("i like lambda");
}
}
Lambda表达式及语法
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)
// 1. 不需要参数,返回值为 5
() -> 5
// 2. 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x
// 3. 接受2个参数(数字),并返回他们的差值
(x, y) -> x – y
// 4. 接收2个int型整数,返回他们的和
(int x, int y) -> x + y
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)
也就是说,不需要事先声明参数的类型,圆括号可以没有,大括号可以没有,返回值可以没有
一起来看看具体的使用
public class java8_Lambda_Test {
public static final void main(String[] args) {
Operator addOper = (a, b) -> a + b;
Operator reduceOper = (a, b) -> a - b;
Operator multiplyOper = (a, b) -> a * b;
Operator DivideOper = (a, b) -> a / b;
java8_Lambda_Test test = new java8_Lambda_Test();
System.out.println(test.getResult(3, 3, addOper));//6
System.out.println(test.getResult(3, 3, reduceOper));//0
System.out.println(test.getResult(3, 3, multiplyOper));//9
System.out.println(test.getResult(3, 3, DivideOper));//1
}
public int getResult(int a, int b, Operator operator) {
return operator.convert(a, b);
}
public interface Operator {
int convert(int a, int b);
default int get(int a) {
return a;
}
}
}
你需要注意什么
1.lambda 表达式只能引用标记了 final 的外层局部变量
2.可以直接在 lambda 表达式中访问外层的局部变量
Lambda的实际运用
1.对集合排序
问题描述:在一个存放了Student对象的list中,按年龄进行排序,输出排序后的list
Student类
public class Student implements Comparable<Student>{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(Student student2) {
int result =this.age - student2.age;
return result;
}
}
List<Student> list=new ArrayList<>();
Student s1=new Student();
s1.setName("张三");
s1.setAge(28);
list.add(s1);
Student s=new Student();
s.setName("李四");
s.setAge(22);
list.add(s);
sortUsingJava8(list);
list.forEach((student) -> System.out.println(student.getName() + ":"+student.getAge()));
// 使用 java 8 排序
static void sortUsingJava8(List<Student> list){
Collections.sort(list, (student1, student2) -> student1.compareTo(student2));
}
来康康使用Java7进行排序是这样的:
// 使用 java 7 排序
private void sortUsingJava7(List<String> list){
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.compareTo(s2);
}
});
}
2.遍历集合
//先准备一个集合
List<Student> list=new ArrayList<>();
Student s1=new Student();
s1.setName("张三");
s1.setAge(28);
list.add(s1);
Student s=new Student();
s.setName("李四");
s.setAge(22);
list.add(s);
//使用 lambda 表达式以及函数操作(functional operation)
list.forEach((student) -> System.out.println(student.getName() + ":"+student.getAge()));
3.遍历集合(带条件)
//带条件 打印年龄大于等于20的学生的姓名
list.forEach((student)->{
if (student.getAge()>=20)
System.out.println(student.getName());
});
4.代替 Runnable,开启一个线程
Runnable r = new Runnable() {
@Override
public void run() {
//to do something
}
};
Thread t = new Thread(r);
t.start();
现在这样写:
Runnable r = () -> {
//to do something
};
Thread t = new Thread(r);
t.start();
你还可以这样写:
Thread t = new Thread(() -> {
//to do something
// such as for
for(int i = 0; i < 100; i++){
System.out.println(i);
}
});
t.start;
来源:https://blog.csdn.net/sxh06/article/details/120126810


猜你喜欢
- 本文研究的主要内容是Java编程二项分布的递归和非递归实现,具体如下。问题来源:算法第四版 第1.1节 习题27:return (1.0 -
- 1.前言(基于JDK1.7)最近想把一些java基础的东西整理一下,但是又不知道从哪里开始!想了好久,还是从最基本的jvm开始吧!这一节就简
- 为了演示光照效果,在前面学习过的内容基础上我们首先创建一个立方体,同时为了看起来直观一些,这个立方体每个面采用中心为白色,周围红色的渐变方案
- 一、this关键字的作用this关键字除了可以强调本类中的方法还具有以下作用。1.表示类中的属性2.可以使用关键字调用本类中的构造方法3.t
- 本文实例为大家分享了Unity使用摄像机实现望远镜效果的具体代码,供大家参考,具体内容如下听起来挺酷炫,其实超简单,就是控制摄像机的fiel
- 今天有朋友问我一道面试题,有5个人抢5个红包,可重复抢,用多线程程序实现,实现方式有多种,分享一下我的思路:应用了阻塞队列的特性。/**
- 之前知道spring支持JSR校验,在自己定义的bean中加入@NotNull,@NotBlank,@Length等之类的校验用于处理前台传
- 使用简单的fragment实现左侧导航,供大家参考,具体内容如下先上效果图:MainActivity.javapublic class Ma
- 本文以实例讲述了C#简单的向量用法,主要包括重载运算符>:以向量长度判断是否为真、重载运算符!=、<、<=等,具体实现代码
- 上篇文章我们已经可以在 Grafana 上看到对应的 SpringBoot 应用信息了,通过这些信息我们可以对 SpringBoot 应用有
- 前情提要:本demo是基于springboot+mybatis-plus实现加密,加密为主,全局异常处理,日志处理为辅,而登录密码加密是每个
- 先上一张效果图using UnityEngine;using System.Collections;public class TestRot
- 当前比较成熟一点的应用基本上都会在进入应用之显示一个启动界面.这个启动界面或简单,或复杂,或简陋,或华丽,用意不同,风格也不同.下面来观摩几
- 描述项目中用到boot 整合 mybatis-plus , 个人在使用分页条件查询的时候一直查不出 total, pages, 终于找到原因
- 先看看效果图:1、XML布局引入<com.net168.lib.SortTabLayout android:id=&quo
- 刚学习c#的朋友要自己手动编译c#代码加深记忆,现在总结下如果手动编译!1、先找到系统的.net 环境在一般在 C:\Window
- 一、智能指针-唯一所有者boost::scoped_ptr 是一个智能指针,它是动态分配对象的唯一所有者。 boost::scoped_pt
- 如题,市面上常见的方法是:var handle = bmp.GetHicon(); //得到图标句柄return Icon.Fr
- 背景随着富客户端框架的盛行,以及众多优秀的前端js框架,很多情况我们会遇到跨域的问题,而js的ajax请求是不允许直接跨域访问的,当然你会说
- 前文由于经常用到串口调试, 尽管有现成的软件, 因为前端时间涉及一个二次开发, 就因为一个RtsEnable设置, 折腾半天, 网上各种版本