Lamda表达式

【一站式学会Kotlin】第六节 lamda表达式、拖尾lamda表达式 (1)lamda表达式总是在花括号中(2)完成的语法形式参数声明放在花括号内,(可选)(3)函数体跟在->后(4)如果能推断出该lamda表达式的返回值类型不是Unit,那么该lamda主体中的最后一个(或kennel是单个)表达式会视为返回函数。 阅读详情

Lamda表达式

1.什么是Lamda?

Lamda 是JAV 8 添加的一个新的特性,说白了Lamda 就是一个匿名函数。

为什么要使用Lamda?

使用Lamda表达式可以对一个接口实现非常简洁的实现。

比如说我们要实现一个比较大小的接口:

方式一:接口的实现类来完成此功能。
public class Program {
    public static void main(String[] args) {
        MyComparator myComparator = new MyComparator();
        myComparator.compar(4, 6);
    }
}
​
interface Comparator {
    int compar(int a, int b);
}
class MyComparator implements Comparator {
    @Override
    public int compar(int a,int b) {
        return a-b;
    }
}
​
​
方式二:匿名内部类
​
    public class Program {
    public static void main(String[] args) {
        Comparator comparator = new Comparator() {
            @Override
            public int compar(int a, int b) {
                return a-b;
            }
        };
         int compar = comparator.compar(4, 6);
         System.out.println(compar);
    }
}
​
interface Comparator {
    int compar(int a, int b);
}
​
方式三:Lamda 表达式
    
public class Program {
    public static void main(String[] args) {
        Comparator comparator =  (a,b)->a-b;
         int compar = comparator.compar(4, 6);
         System.out.println(compar);
    }
}
​
interface Comparator {
    int compar(int a, int b);
}

Lamda对接口的要求是什么?

虽然可以使用Lamda 表达式对某些接口进行简单的实现,但并不是所有的接口都可以用Lamda表达式来实现。要求接口中定义的必须是要实现的抽象方法只能是一个

*JAVA 8 对接口家里一个新的特性:default*

 

@FunctionalInterface修饰函数式接口的,接口中的抽象方法只有一个。

 

如果有多个抽象方法就会报错

 

2.Lamda基本语法

首先需要注意的是 Lamda 是一个匿名函数那么有以下几个关注点

  1. 参数列表名

  2. 方法体

  3. 返回值类型 (在Lamda 中返回值不用显示的写出)

  4. 方法名(匿名不用关注)

 

符号含义
()用来描述参数列表
{}用来表示方法体
->Lamda运算符 读作 goes to
1.无参无返回值
@FunctionalInterface
public interface LamdaNoneReturnNoneParamter {
    void test();
}
​
class imTest{
    public static void main(String[] args) {
        LamdaNoneReturnNoneParamter lamdaNoneReturnNoneParamter = ()->{
            System.out.print("无参无返回值");
        } ;
    }
}
​
2.无返回值单个参
@FunctionalInterface
public interface LamdaNoneReturnNoneParamter {
    void test(int i);
}
​
class imTest{
    public static void main(String[] args) {
        LamdaNoneReturnNoneParamter lamda1 = (int c)->{
            System.out.print(c);
            System.out.print("无返回值单个参");
        } ;
        lamda1.test(10);
    }
}
​
3.无返回值多个参
@FunctionalInterface
public interface LamdaNoneReturnMutipleParamter {
    void test(int a, int b);
}
​
class imTest3{
    public static void main(String[] args) {
        LamdaNoneReturnMutipleParamter lamda3 = (int c,int d)->{
            System.out.println(c+"--------"+d);
            System.out.println("无返回值多个参");
        };
        lamda3.test(11, 33);
    }
}
​
4.有返回值没有参
@FunctionalInterface
public interface LamdaSingleReturnNoneParam {
    int test(); 
}
class imTest4{
    public static void main(String[] args) {
        LamdaSingleReturnNoneParam lamda4 = ()->{
            System.out.println("有返回值没有参");
            return 10;
        };
        int demo = lamda4.test();
        System.out.println(demo);
    }
}
5.有返回值单个参数
​
@FunctionalInterface
public interface LamdaSingleReturnSingleParamter {
    int test(int d);
}
​
class imTest5{
    public static void main(String[] args) {
        LamdaSingleReturnSingleParamter lamda5 = (int a)->{
            System.out.println("有返回值单个参数");
            return a*10;
        };
        int demo = lamda5.test(10);
        System.out.println(demo);
    }
}
6.有返回值多个参数
​
@FunctionalInterface
public interface LamdaSingleReturnMultipleParamter {
    int test(int a, int b, int c);
}
​
class imTest6{
    public static void main(String[] args) {
        LamdaSingleReturnMultipleParamter lamda6 = (int a,int b,int c)->{
            System.out.println("有返回值单个参数");
            return a*b*c;
        };
        int demo = lamda6.test(10,2,3);
        System.out.println(demo);
    }
}

3.Lamda语法精简

  1. 由于在接口的抽象方法中,已经定义了参数的数量和类型,所以 可以将参数的类型可以省略(如果需要省略参数类型,则每个参数的类型都要省略)。

  2. 如果参数列表中,参数的数量只有一个,此时小括号可以省略。

  3. 方法大括号:如果方法体中只有一条语句时,大括号可以省略。

  4. 如果方法体中唯一的一条语句是一个返回语句,return也可以省略。

4.语法进阶

方法引用:可以快速的将一个Lamda表达式的实现指向一个已经实现的方法。

语法:方法的隶属者::方法名,需要注意参数类型和类型一定要和接口一致。

@FunctionalInterface
public interface LamdaSingleReturnSingleParamter {
    int test(int d);
}
​
import faces.LamdaSingleReturnSingleParamter;
​
class Syntax2 {
    public static void main(String[] args) {
        LamdaSingleReturnSingleParamter lamda = a -> change(a);
        //简化为:
        LamdaSingleReturnSingleParamter lamda2 = Syntax2::change;
    }
​
    private static int change(int a) {
        return a * 2;
    }
}

构造方法的引用:

无参
class syntax3 {
    public static void main(String[] args) {
        PersonCreate person =  ()-> new Person("zs","ls");
        System.out.println(person);
​
        //构造函数的引用
        PersonCreate person2 =  Person::new;
        Person  zs  = person2.getPerson();
        System.out.println(zs);
​
    }
​
​
}
 interface PersonCreate {
     Person getPerson();
 }
​
有参
    class syntax3 {
    public static void main(String[] args) {
​
        //构造函数的引用
        PersonCreate person2 =  Person::new;
        Person  zs  = person2.getPerson("zs","ls");
        System.out.println(zs);
​
    }
​
​
}
 interface PersonCreate {
     Person getPerson(String name,String sex);
 }

综合练习:

package syntax;
​
import java.util.ArrayList;
​
class syntax3 {
    public static void main(String[] args) {
        ArrayList<Person> personList = new ArrayList<>();
        personList.add(new Person("zs",12 ));
        personList.add(new Person("we",142 ));
        personList.add(new Person("ee",52 ));
        personList.add(new Person("ww",3 ));
        personList.add(new Person("ee",122 ));
        personList.add(new Person("qew",2 ));
        personList.add(new Person("ss",7 ));
        personList.sort((o1,o2)->o2.age-o1.age);
        System.out.println(personList);
    }
​
}
​

 

换成TreeSet

package syntax;
​
import java.util.TreeSet;
​
class syntax3 {
    public static void main(String[] args) {
        TreeSet<Person> set = new TreeSet<>();
        set.add(new Person("zs",12 ));
        set.add(new Person("we",142 ));
        set.add(new Person("ee",52 ));
        set.add(new Person("ww",3 ));
        set.add(new Person("ee",122 ));
        set.add(new Person("qew",2 ));
        set.add(new Person("ss",7 ));
        System.out.println(set);
    }
}
​

 

 

person对象不能转型为Comparable ,因为set集合是自带排序,但是如果是person对象的话,就无法判断其大小,

 

根据源码可知,需要有一个Comparator 对象的实现类来提供对象的比较规则。因此代码如下:

package syntax;
​
import java.util.TreeSet;
​
class syntax3 {
    public static void main(String[] args) {
        TreeSet<Person> set = new TreeSet<>((o1,o2)->o1.age-o2.age);
        set.add(new Person("zs",12 ));
        set.add(new Person("we",142 ));
        set.add(new Person("ee",52 ));
        set.add(new Person("ww",3 ));
        set.add(new Person("ee",122 ));
        set.add(new Person("qew",2 ));
        set.add(new Person("ss",7 ));
        System.out.println(set);
    }
}

 

集合遍历实现:

 

package syntax;
​
import java.util.ArrayList;
import java.util.Collections;
​
class syntax3 {
    public static void main(String[] args) {
        ArrayList<Integer> arry = new ArrayList<>();
        Collections.addAll(arry, 1,3,2,4,5,6,8,7,9,10);
        arry.forEach(element ->{
            if(element % 2 ==0) {
                System.out.println(element);
            }
        });
    }
}

 

实现判断删除

package syntax;
​
import java.util.ArrayList;
import java.util.ListIterator;
​
class syntax3 {
    public static void main(String[] args) {
        ArrayList<Person> personList = new ArrayList<>();
        personList.add(new Person("zs",12 ));
        personList.add(new Person("we",142 ));
        personList.add(new Person("ee",52 ));
        personList.add(new Person("ww",3 ));
        personList.add(new Person("ee",122 ));
        personList.add(new Person("qew",2 ));
        personList.add(new Person("ss",7 ));
        ListIterator<Person> iterator  = personList.listIterator();
        while (iterator.hasNext()) {
            Person person = (Person) iterator.next();
            if(person.age > 10) {
                iterator.remove();
            }
            
        }
        System.out.println(personList);
    }
​
}

 

使用Lamda 表达式实现

 

 

package syntax;
​
import java.util.ArrayList;
​
​
class syntax3 {
    public static void main(String[] args) {
        ArrayList<Person> personList = new ArrayList<>();
        personList.add(new Person("zs",12 ));
        personList.add(new Person("we",142 ));
        personList.add(new Person("ee",52 ));
        personList.add(new Person("ww",3 ));
        personList.add(new Person("ee",122 ));
        personList.add(new Person("qew",2 ));
        personList.add(new Person("ss",7 ));
        
        //将集合中的每个元素都带入到test方法中进行比较,如果返回true 则删除这个元素。
        personList.removeIf(element -> {
            if(element.age % 2== 0) {
                return true;
            }
            return false;
        });
        System.out.println(personList);
    }
​
}

 

 

使用lamda 实例化线程对象

 

5.Lamda系统内置

package syntax;
​
​
public class syntax3 {
    public static void main(String[] args) {
        //需求:实现runable 接口开启一个线程,做一个数字输出
        Thread thread = new Thread(()->{
            int i = 0;
            do {
                System.out.println(i++);
            } while (i<=10);
        });
        thread.start();
    }
​
}

 

6.系统内置的函数式接口

在java.util.function下面的所有接口都是系统内置的函数式接口

 

  • Predicate<T> 参数 : T 返回值 :boolean

实体参数返回值
IntPredicateintboolean
LongPredicatelongboolean
DoublePredicatedoubleboolean
  • Consumer<T>参数 : T 返回值 :void

实体参数返回值
IntConsumerIntvoid
LongConsumerLongvoid
DoubleConsumerDoublevoid
  • Supplier<T> 参数 : 无 返回值 :T

  • UnaryOperator<T> 参数 : T返回值 :T

省略。。。。。。

7.闭包

 

package syntax;
​
import java.util.function.Supplier;
​
public class syntax3 {
    public static void main(String[] args) {
         Integer num = getNum().get();
         System.out.println(num);
    }
​
    private static Supplier<Integer> getNum() {
        int num = 10;
        return ()->{
            return num;
        };
    }
​
} 

 

RTKlib操作手册--使用样例数据演示 本文将使用样例数据演示如何使用RTKLIB进行rtk差分定位。 阅读详情

相关推荐

告别手动!用Python+CATIA V5/V6自动生成三视图和标题栏(附完整代码)

本文详细介绍了如何利用Python和CATIA V5/V6实现工程图自动生成,包括三视图布局和标题栏填写。通过COM接口调用和智能算法,系统能自适应不同尺寸模型,大幅提升设计效率。附完整代码和部署方案,帮助团队实现从手动到自动化的转变。

weixin_42699679的博客 353

使用TreeSet时添加数据遇到的一些问题

1、当TreeSet对象为空时,添加第一个数据时第一条数据会自己与自己进行比价而非直接添加至TreeSet中 运行结果: 程序添加第一条数据时如果是直接添加至TreeSet中则不会进行比较,即不会使用compareTo方法,而运行结果表明了在TreeSet为空时添加数据,数据会自行与自身进行比较。2、TreeSet进行插入数据时,如果两条数据相同则将新传入的数据丢弃3、类继承Comparable,重写compareTo方法,当新增数据时,是拿新增数据与原有数据进行比较,即compareTo

weixin_43642752的博客 534

《YOLOv8实例分割实战:训练自己的数据集 》(视频课程)

本课程将手把手地教大家使用labelme标注和使用YOLOv8训练自己的数据集,完成一个多目标实例分割实战项目。

bai666ai的博客 790

Java中TreeSet使用Lambda和比较类的方法

package CollectionTest; import java.util.TreeSet; import java.util.Comparator; class M { int age; public M(int age) { this.age = age; } public String toString() { return "M[age:" + age ...

jthkl的专栏 1393

AD9026芯片开发实战:从Example Code到API调用的关键步骤解析

本文详细解析了AD9026芯片开发的核心流程,重点阐述了如何从官方提供的Example Code入手,逐步理解硬件平台发现、HAL层初始化、配置加载、芯片复位、固件启动、JESD链路建立等关键API调用序列。通过剖析示例工程的结构与核心文件,为开发者在自定义硬件平台上移植和调试AD9026驱动提供了清晰的实战指南。

java5的博客 788

[GXYCTF2019]BabyUpload1 -- .htaccess文件解析与蚁剑实战指南

本文深入解析了[GXYCTF2019]BabyUpload1文件上传漏洞的实战利用。通过绕过后缀名与内容检测,上传包含PHP代码的.jpg文件,并利用.htaccess文件强制服务器将其解析为PHP脚本。文章详细介绍了.htaccess的原理、构造方法、Content-Type绕过技巧,并演示了如何使用中国蚁剑连接Webshell获取Flag,为Web安全学习提供了完整实战指南。

weixin_29016315的博客 509

Lambda表达式的一点点总结

一 Lambda简介 什么是Lamba表达式? Lambda是JAVA8添加的新特性,Lambda就是一个匿名函数。 为什么使用Lambda表达式? 使用Lambda表达式可以对一个接口进行非常简洁的实现 Lambda表达式对接口的要求? 虽然可以使用Lambda表达式对某些接口进行简洁的实现,但是并不是所有的接口都可以使用Lambda来实现。 Lambda表达式要求接口中定义的必须要实现的抽象方法只能是一个。 备注:在JAVA8中新增加了一个对接口的特性 default 参考链接 :j..

qq_37708081的博客 378

工业4.0必备:C#上位机+数字孪生 生产线实时监控与智能预警系统(工业级实战)

数据割裂:PLC、传感器、工业相机的数据散落在不同系统,想看全局生产状态要切换N个软件,“数据孤岛”导致决策滞后;故障难预判:设备突发故障时,只能停机排查,平均故障响应时间超30分钟,一条生产线停工1小时损失超10万;可视化差:传统监控只有冰冷的数字和2D图表,设备运行状态、生产流程、物料流转无法直观感知,新人上手需3个月才能熟悉产线。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 659

一、Lamda表达式

Lamda表达式

shiyu_951的博客 2375

MDF和DHF、DMR、DHR三者差异?注册与备案文件?医疗器械产品技术要求编写指导原则

定义:设计历史文档(DHF ) 指的是描述某医疗器械成品设计过程的有关记录。内容:DHF包括设计开发活动的所有记录。从最初的策划、客户需求、设计输入,设计输出、设计验证、设计确认、所有的设计评审,设计转换,以及设计变更相关的所有记录。均属于DHF的一部分。要求:各制造商应为每个类型的器械建立并保持设计历史文件。设计历史文件应包含或引用必要的记录,以证实设计符合经批准的设计计划和法规的要求。

学海无涯的专栏 9110

Python爬虫实战:高德地图POI信息爬取(餐馆/加油站等),附选址分析技巧

高德API配置AMAP_KEY = "你的高德API Key" # 替换成自己的Key# 爬取参数CITY = "成都" # 城市DISTRICTS = ["锦江区"] # 区域,可添加多个(比如["锦江区", "武侯区"])KEYWORDS_LIST = ["川菜馆", "加油站"] # 要爬取的POI类型TYPES = {"川菜馆": "050101", # 餐饮服务→中餐→川菜馆(高德POI分类编码)"加油站": "110100" # 交通设施→加油站。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2469

Lamda表达式好处、Lamda表达式演变、Lamda表达式使用总结

Lamda表达式好处、演变、使用总结使用Lamda表达式的好处Functional Interfere:函数式接口Lamda表达式的演变过程1.一个接口对应多个实现类,造成编写的文件数量很多2.使用内部类定义实现类2.1静态内部类2.2局部内部类2.3匿名内部类3.Lamda表达式3.1Lamda表达式继续简化Lamda表达式使用总结 使用Lamda表达式的好处 避免匿名内部类定义过多 可以让代码看起来更简洁 去掉一对无意义的代码,只留下核心逻辑 Functional Interfere:函数式接口 理

郝开的博客 2083

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java笔记:Lamda 表达式

Java笔记:Lamda 表达式 参考资料:http://www.mldn.cn/course/40/task/512/show 一、Lamda表达式的作用   Lamda 是一种基于函数的编程方式。java是面向对象的编程语言,也就是说一切操作都基于类,所有功能都定义在类中。很多习惯于函数编程的开发者就觉得不好用,为了吸引更多开发者,java1.8终于推出了Lamda表达式。   但并不...

weixin_39855497的博客 463

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++ lamda表达式

lamda表达式是C++11中的新特征,说白了就是匿名函数。lambda表达式的具体形式如下: [capture](parameters)->return-type{body} 其中, capture是需要用到的外部变量, parameters是函数参数,return-type是返回的类型(可省略),body是函数体。...

342

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

2、接口 、Lamda表达式

接口 、Lamda表达式 接口不是类,而是对类的一组需求描述 接口的所有方法自动属于public,不过在实现接口时,必须将实现方法声明为public,否则,编译器认为试图给出更严格的访问权限的警告,接口可以定义常量,但接口不能有实例变量 类实现一个接口,需要步骤为: ​ 将类声明为实现给定的接口 ​ 对接口内的所有方法进行定义 compare的比较,常规的相减操作时明确比较的值是非负整数或者其值在(Integer.MAX_Value-1)/2的范围内,否则用Integer.com

weixin_45694230的博客 336

lamda表达式

lamda表达式 java8的新特性 第一课: lamda简单示例 package lamda; /** * @author Fegert * @version 2019年9月18日 下午7:55:53 * */ public class lamdaTest { public static void main(String[] args) { // 1.使用接口实现类的方式 ...

weixin_44779019的博客 336

Lamda表达式之 GroupBy 分组 、OrderByDescending排序

表结构如下: Lamda表达式: List model = NewsService.GetNewsAllList(null, whereCriteria, null);//获得数据 if (model != null)//数据不为空时,分组并排序 { var ls =

Java_c# 7360

Lamda表达式和内部类

当参数的个数只有一个时,括号可以省略; 当函数中语句只有一句时,大括号可以省略; 前提是接口为函数式接口(只包含一个抽象方法)才能使用Lamda表达式。

单引号的博客 148

Lamda表达式结合Stream使用总结

什么是Lamda表达式?Lambda 表达式,也可称为闭包。Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。或以下是lambda表达式的重要特征:1)可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。2)可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。3)可选的大括号:如果主体包含了一个语句,就不需要使用大括号。4)可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值。

weixin_53273474的博客 239

为什么推荐使用Lamda表达式

最近参加一次培训的时候,发现部分人对委托这个概念很模糊,委托这些概念是.NET高级编程中的,当一个程序员经过一个阶段的学习之后,想要有一个提高,这时候学习这些概念就是必须的了,所以在讲Lamda表达式时,把这委托,匿名委托(匿名方法),Lamda表达式这几个概念整理了一下。 网上这方面的例子很多,但是对于起步阶段的人来说,这些例子显的晦涩了,所以我举得例子中,为了更清楚的...

weixin_30267691的博客 162

听说你想了解一下Lamda表达式?

说好的了解lamda表达式的,你却不点进来,不爱了,我懂,我明白

m0_67924751的博客 229

jdk8新特性之Lamda表达式

jdk8新特性之Lamda表达式无参数无返回值格式一个参数无返回值格式有多个参数有返回值并且Lamda体中有多条语句Lamda的使用 Lamda表达式的形式为左侧为参数列表,右侧为函数体或Lamda体;Lamda表达式配合上Stream API可以快速的进行数据处理。 Lamda表达式可以有多种格式,分别为:无参无返回值、有一个参数无返回值、有多个参数有返回值并且Lamda体中有多条语句。 Lamada需要搭配函数式接口进行使用;函数式接口即只有一个抽象方法的接口,可以使用@FunctionalInterf

qq_44157349的博客 327
上一篇: Linux vi 和vim编辑器
白马非马啊
博客等级 码龄10年 13粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值