首页 > 编程语言 >Java——lambda表达式

Java——lambda表达式

时间:2023-05-05 12:44:18浏览次数:33  
标签:Java int 接口 lambda 表达式 Lambda

Java lambda表达式是Java 8中引入的一种新特性,它可以用来简化代码并提高程序员的生产力。Lambda表达式本质上就是一个匿名函数,它没有名称、修饰符和返回类型。

在使用lambda时需要注意以下几点:

  1. Lambda表达式由箭头(->)分隔成两部分:左侧为参数列表,右侧为所需执行的功能。
  2. 如果只有一个参数,则不必使用括号;如果没有参数则必须加上空括号()。
  3. 如果要指定数据类型,则需要将其放在圆括号内,并且也可以省略掉大括号{}以及return关键字。

下面给出了三个例子说明如何使用lambda:

  1. 使用无参方法
Runnable r = () -> System.out.println("Hello World");

这里我们定义了一个Runnable对象r,在其中实现了run方法打印"Hello World"字符串。因此当调用该对象的run方法时会输出相应内容。

  1. 使用单个输入变量
Consumer<String> c = (s) -> System.out.println(s);
c.accept("This is a test.");

这里我们定义了一个消费者接口Consumer<T>型别T被设置为String, 并创建对应于该接口实例c 。然后通过accept 方法传递“ This is a test.” 字符串作为唯一输入值进行测试.

  1. 省略形参声明与花括号
Comparator<Integer> c = (a, b) -> a.compareTo(b);

这里我们定义了一个比较器接口Comparator<T>型别T被设置为Integer,并创建对应于该接口实例c。然后通过compareTo方法进行两个整数的大小比较。

总之,Java lambda表达式是一种简洁、灵活和强大的编程方式,在处理集合数据时尤其有用。它可以帮助程序员更快地开发出高效且易维护的代码。
除了上述介绍的基本用法,Java lambda表达式还有一些高级特性:

  1. 方法引用

方法引用是lambda表达式的简化形式。它可以直接使用已经存在的方法来代替lambda中需要实现的功能。

例如,在对一个字符串列表进行排序时,我们可以这样写:

List<String> list = Arrays.asList("apple", "banana", "orange");
list.sort(String::compareToIgnoreCase);

其中String::compareToIgnoreCase就是通过“双冒号”操作符将该类中定义好并且可重载(即参数类型和个数不同)与当前调用处相匹配函数名字传递给sort() 函数作为比较器对象.

  1. Lambda范围

Lambda表达式内部访问外部变量时会创建一个新局部变量,并拷贝其值到Lambda体内。因此在修改该局部变量后原始值仍然保持不变。

例如,

int num = 10;
Runnable r = () -> {
    int num2=20; // 局域常规声明 
    System.out.println(num); // 访问num 变量, 输出结果: 10  
};
r.run();
  1. Stream API

Stream API 是 Java8 中新增加处理集合数据流程方式API 。 它提供了很多便捷、灵活而强大地聚合操作以及过滤等能力 ,使得开发者们更容易编写出优雅而有效率代码 .

下面展示一个简单的例子:

List<String> list = Arrays.asList("apple", "banana", "orange");
long count = list.stream().filter(s -> s.startsWith("a")).count();
System.out.println(count); // 输出结果: 1 

这里我们使用了stream()方法将列表转换为流,然后通过filter()方法过滤出以"a"开头的字符串,并最终统计数量。

总之,Java lambda表达式是一种非常强大和灵活的编程方式。它可以帮助程序员更快地实现代码并提高生产力,在处理集合数据时尤其有用。同时也需要注意Lambda范围、Stream API等相关特性来避免潜在问题或错误发生。
4. 函数式接口

函数式接口是指只有一个抽象方法的接口。Java lambda表达式可以被赋值给这种类型的变量,从而实现对该单一方法进行重写。

例如,在使用Comparator时我们就需要传递一个比较器对象作为参数,它必须满足“只包含一个抽象方法”的条件:

public interface Comparator<T> {
    int compare(T o1, T o2);
}

因此在创建比较器对象时我们可以直接使用lambda表达式来代替原本需要定义匿名内部类的方式:

List<String> list = Arrays.asList("apple", "banana", "orange");
list.sort((s1, s2) -> s1.compareToIgnoreCase(s2));
  1. 并行流处理

并行流(Parallel Streams)是Stream API中提供了多线程执行集合数据操作功能 。 它能够将大型数据分割成小块,并且利用所有可用CPU核心同时处理每个子任务以加速整体计算过程 。

下面展示如何通过并行流求出列表元素平方和:

List<Integer> numbers = Arrays.asList(3, 4, 7 ,8);
int sumOfSquares = numbers.parallelStream().mapToInt(x -> x * x).sum();
System.out.println(sumOfSquares); // 输出结果: 114 
  1. Lambda与Optional结合应用

Lambda 表达 式 和 Optional 类 型 是 Java 中两个非常强 大 的 特性 。 它们的结合使用可以帮助我们更好地处理空值问题,避免出现 NullPointerException 异常。

例如,在对一个字符串进行转换时可能会产生 null 值:

String str = "123";
Integer num1 = Integer.parseInt(str); // 正确情况下返回整数 
str = "";
Integer num2= Integer.parseInt(str);  // 抛出异常: NumberFormatException  

这里如果输入为空串,则parseInt()方法将抛出NumberFormatException。为了解决该问题,我们可以通过Optional类型来包装结果并在需要时检查是否存在:

String str=""; 
Optional<Integer> optionalNum3 =
    Optional.ofNullable(
        (str.isEmpty()) ? null : Integer.valueOf(str));
if(optionalNum3.isPresent()){
   System.out.println("Value is present.");
} else {
   System.out.println("Value not available.");   
}

总之, Java lambda表达式是一种非常强大和灵活的编程方式,并且与其他Java特性如函数接口、Stream API等相互配合能够实现更加高效而优雅代码设计及开发过程.
7. Lambda与注解

Java 8中的Lambda表达式可以和注解一起使用,这使得我们能够更加灵活地定义自己的函数接口。

例如,在下面代码片段中,@FunctionalInterface 注释用于标记该接口是一个功能性 接 口 ,并且只包含了单个抽象方法:

@FunctionalInterface 
interface MyFunction {
    int apply(int x, int y);
}

然后在调用时就可以直接传递lambda表达式作为参数:

MyFunction add = (x,y) -> x + y;
int result = add.apply(3,4); // 结果:7  

通过上述方式实现对两数求和操作。同时也需要注意到 apply() 方法被重写以满足当前需求.

总之,Lambda 表 达 式 和 Java 中其他特 性 如 函数型 接 口、Stream API 等相互配合应用可帮助程序员编写出高效而优雅 的代 码 。 同时它们还支持多种语言级别(如类型推断)及运行环境层次 (如JVM JIT 编译器等),从而进一步提升开发者生产力 .

标签:Java,int,接口,lambda,表达式,Lambda
From: https://www.cnblogs.com/SwapEnd/p/17373006.html

相关文章

  • Java异常
    Java的异常是指在程序运行过程中出现的错误或异常情况,例如除数为零、数组越界、空指针等。Java中的异常分为两种:受检异常和非受检异常。受检异常是指在编译时就能够检测到的可能发生的问题,必须要进行处理才能通过编译。这些问题通常与外部环境有关,并且可以被预见并避免。比如文件......
  • Java Web超大文件上传和断点续传的实现
    ​前言文件上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个好的办法,毕竟很少有人会忍受,当文件上传到一半中断后,继续上传却只能重头开始上传,这种让人不爽的体验。那有没有比......
  • java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/
    Java使用AES/CBC/PKCS7Padding加解密时会报错,因为原生JDK不支持。1.在jdk中的jre\lib\security修改java.security文件,替换security.provider.7=org.bouncycastle.jce.provider.BouncyCastleProvider2./jdk/jre/lib/ext下添加jar包bcprov-jdk15on-1.58.jar ......
  • Java 新的生态型应用开发框架,Solon v2.2.14 发布
    Java新的生态型应用开发框架,Solon:更快、更小、更简单。从零开始构建,有自己的标准规范与开放生态:150多个生态插件,可以满足各种场景开发大量的国产框架适配,可以为应用软件国产化提供更好支持相对于SpringBoot和SpringCloud的项目:启动快5~10倍。(更快)qps高2~3......
  • 高级Java程序员必问,Redis事务终极篇
    1.简介1.1什么是Redis事务Redis事务(Transaction)通过将多个Redis操作封装为一个原子性的操作序列,确保在事务执行过程中,不会受到其他客户端的干扰。从而在保证数据一致性的同时,协调并发,提高数据操作的效率和性能。1.2Redis事务的应用场景在分布式系统和高并发场景下,事务处理......
  • [转]Java 获取操作系统的信息
    链接: https://blog.csdn.net/csdntoast/article/details/506398191获取本机的IP地址:privatestaticStringgetIpAddress()throwsUnknownHostException{InetAddressaddress=InetAddress.getLocalHost();returnaddress.getHostAddress();}......
  • java 实现简单的http客户端
    1、废话不多说,代码如下packagecom.linhuaming.test;importjava.io.InputStream;importjava.io.OutputStream;importjava.net.MalformedURLException;importjava.net.Socket;importjava.net.URL;/***http客户端测试*/publicclassHttpClientTest{pub......
  • 【javascript】typeof 和 instance of的差异
    typeof与instanceof都是判断数据类型的方法,区别如下:1.typeof会返回一个运算数的基本类型,instanceof返回的是布尔值2.instanceof可以准确判断引用数据类型,但是不能正确判断原始数据类型3.typeof虽然可以判断原始数据类型(null除外),但是无法判断引用数据类型(function除外)所以如......
  • 【Java学习笔记】Maven项目+Junit5单元测试
    1.Maven简介;Maven概念:仓库、坐标Maven坐标:描述仓库中资源的位置Maven坐标查找:https://mvnrepository.com/Maven坐标组成:-groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.Google)-artifactId:定义当前Maven项目名称(通常是模块名称)-version:定义当前Maven项目......
  • 力扣141(Java)-环形链表(简单)
    题目:给你一个链表的头节点head,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。注意:pos不作为参数进行传递 。仅仅是为了标识......