Lambda表达式详解

2023-05-16

    Java 8最值得学习的特性就是Lambda表达式。Lambda写的好可以极大减少代码冗余,同时可读性也好过冗长的内部类,匿名类。

举例说明一下:

(1)创建线程传统写法:

		Thread t1=new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println("hello~");
			}
		});
		t1.start();

lambda表达式写法:

		Thread t2=new Thread(()->System.out.println("hello~lambda"));
		t2.start();

(2)排序传统写法:

		List<String> list=Arrays.asList(new String[]{"b","c","a"});
		Collections.sort(list,new Comparator<String>() {

			@Override
			public int compare(String o1, String o2) {
				return o1.compareTo(o2);
			}
			
		});

lambda写法:

Collections.sort(list,(o1,o2)->o1.compareTo(o2));

    Lambda表达式配合java 8新特性Stream API可以将业务功能通过函数式编程简洁的实现。

lambda表达式的组成:参数列表,箭头,以及一个语句块或者是表达式。

()->{}
(int x,int y)->x+y  //表达式
(int x,int y)->{x+y}; //语句块

()为参数列表,参数的类型可以省略,java编译器可以自动推断。如果只有一个参数且可以被java推断出类型,那么参数列表也可以省略。Lambda表达式的类型叫做“目标类型”,他是一个“函数接口”。(定义:如果一个接口只有一个显式声明的抽象方法,那么它就是一个函数接口,一般用@FunctionalInterface标注出来(也可以不标))。

所以可以用lambda表达式为一个函数接口赋值,比如,Runnable就是一个函数接口,因为它只有一个显式声明的run方法。所以可以用lambda表达式如下:

Runnable r1=()->{System.out.println("hellodake");};

    一个lambda表达式只有在转型成一个函数接口后才能被当作Object使用。所以不能如下使用:

System.out.println(()->{System.out.println();});

必须先将lambda转型如下:

System.out.println((Runnable)()->{System.out.println();});

一个lambda可以有多个目标的类型(函数接口),只要函数匹配成功就行,但至少应该有一个。

所以以下这种情况也是可以的。

Runnable r2=()->{System.out.println("hello");};
MyRunnable r3=()->{System.out.println("dake");};

应用

(1)lambda表达式主要用于替换匿名内部类,各种回调,比如事件响应器,传入Thread类的Runnable等。如:

		Thread t1=new Thread(new Runnable() {
			@Override
			public void run() {
				while(true){
					System.out.println("hello");
				}
			}
		});
		
		Thread t2=new Thread(()->System.out.println());

(2)lambda表达式与集合类批处理操作

未使用lambda表达式的集合迭代操作:

		for(String str:list){
			System.out.println(str);
		}

使用后可以调整为:

list.forEach(str->{System.out.println(str);});

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lambda表达式详解 的相关文章

随机推荐

  • 线程的状态总结以及各状态之间转换

    1 初始 xff08 NEW xff09 xff1a 新创建了一个线程对象 xff0c 但还没有调用start xff08 xff09 方法 xff1b 实现Runnable接口和继承Thread类可以得到一个线程类 xff0c new一个
  • HTTP和HTTPS

    HTTPS就是HTTP加上加密处理 xff08 一般是SSL安全通信线路 xff09 43 认证 43 完整性保护 HTTPS的作用 xff1a 内容加密 xff1a 建立一个信息安全通道 xff0c 来保证数据传输的安全 xff1b 身份
  • spring整合JDBC+spring aop事务

    1 spring整合JDBC spring中提供了一个可以操作数据库的对象 xff0c 对象封装了JDBC技术 JDBCTemplate xff1a JDBC模板对象 与DBUtils中的QueryRunner非常相似 JDBCDaoSup
  • 网站高并发&高可用处理

    1 三大问题 高并发 xff1a 多个进程或线程同时访问同一资源会产生并发问题 xff1b 高可用大数据量 2 解决方案 初级解决方案 xff1a 系统或服务器级别的解决方案 xff1a 增大服务器的CPU xff1b 增加内存条 xff1
  • 背包问题详解

    1 0 1背包问题 问题描述 xff1a 有N件物品和一个容量为V的背包 第i件物品的重量是w i xff0c 价值是p i 求解将哪些物品装入背包可使这些物品的总重量不超过背包容量 xff0c 且价值总和最大 思路 xff1a 每种物品仅
  • 堆排序原理与实现

    堆排序实际上是利用堆的性质来进行排序的 xff0c 我们通常说的堆就是二叉堆 xff0c 二叉堆又称完全二叉树或者近似完全二叉树 堆排序是选择排序的一种 可以利用数组的特点快速定位指定索引的元素 数组可以根据索引直接获取元素 xff0c 时
  • Hashmap1.7和1.8区别+ConcurrentHashmap1.7和1.8区别

    Hashmap JDK1 7中 使用一个Entry数组来存储数据 xff0c 用key的hashcode取模来决定key会被放到数组里的位置 xff0c 如果hashcode相同 xff0c 或者hashcode取模后的结果相同 xff0c
  • TOP k问题

    题目 xff1a 有1千万条短信 xff0c 有重复 xff0c 以文本文件的形式保存 xff0c 一行一条 xff0c 有重复 请用5分钟时间 xff0c 找出重复出现最多的前10条 解析 xff1a 对于本题来说 xff0c 某些面试者
  • CAS操作是怎么实现的

    CAS是compare and swap xff0c 翻译过来就是比较并交换 维护三个变量值 xff0c 一个是内存值V xff0c 一个是期望的旧的值A xff0c 一个是要更新的值B 更新一个变量的时候 xff0c 只有当预期值A与内存
  • liunx在整合springboot 项目时出现错误CLUSTERDOWN The cluster is down

    在运行springboot项目并且把项目利用二级缓存 xff0c 储存到集群中时候在idea下报错显示CLUSTERDOWN The cluster is down 可以进入linux中查看集群配置 连接到某个节点此时显示此时节点明显显示的
  • volatile关键字

    java提供了一种稍弱的同步机制 xff0c volatile变量 xff0c 用来确保将变量的更新操作通知到其他线程 当把变量声明为volatile类型的时候 xff0c 编译器与运行时都会注意到这个变量是共享的 xff0c 所以不会将该
  • MVCC

    在并发读写数据库时 xff0c 读操作可能会不一致的数据 xff08 脏读 xff09 为了避免这种情况 xff0c 需要实现数据库的并发访问控制 xff0c 最简单的方式就是加锁访问 由于加锁会将读写操作串行化 xff0c 所以不会出现不
  • AQS理解

    AbstractQueuedSynchronizer简称AQS xff0c 是一个用于构建锁和同步容器的框架 事实上concurrent包内许多类都是基于AQS构建 xff0c 例如ReentrantLock Semaphere Count
  • B树、B+树及索引

    B树 xff1a 每个节点都存储key和data xff0c 所有节点组成这棵树 xff0c 并且叶子节点指针为null B 43 树 xff1a 只有叶子节点存储data xff0c 叶子节点包含了这棵树的所有键值 xff0c 叶子节点不
  • Arrays.sort和Collections.sort实现原理解析

    Collections sort方法底层就是调用的Arrays sort方法 写一个例子看源码 xff1a public static void main String args List lt String gt strings 61 A
  • Java代理模式之动态代理

    代理模式是设计模式中非常重要的一种类型 代理模式从类型上来说 xff0c 可以分为静态代理和动态代理两种类型 假设一个场景 xff0c 有一个蛋糕店 xff0c 卖的蛋糕都是用蛋糕机做的 xff0c 而且不同种类的蛋糕由不同的蛋糕机来做 x
  • 二叉树镜像

    求二叉树镜像 public class Solution public void Mirror TreeNode root if root 61 61 null return if root left 61 61 null amp amp
  • 设计模式之适配器模式

    适配器模式是作为两个不兼容的接口之间的桥梁 这种类型的设计模式属于结构型模式 xff0c 它结合了两个独立接口的功能 这种模式涉及到一个单一的类 xff0c 该类负责加入独立的或不兼容的接口功能 举个真实的例子 xff0c 读卡器是作为内存
  • 设计模式之单例模式

    1 懒汉式 xff0c 线程不安全 public class Demo1 private static Demo1 instance private Demo1 public static Demo1 getInstance if inst
  • Lambda表达式详解

    Java 8最值得学习的特性就是Lambda表达式 Lambda写的好可以极大减少代码冗余 xff0c 同时可读性也好过冗长的内部类 xff0c 匿名类 举例说明一下 xff1a xff08 1 xff09 创建线程传统写法 xff1a T