返回顶部
首页 > 资讯 > 后端开发 > Python >JavaLambda表达式详解
  • 790
分享到

JavaLambda表达式详解

Python 官方文档:入门教程 => 点击学习

摘要

Java Lambda表达式是jdk8引入的,是一个比较重要的特性 Lambda表达式简介 Lambda 表达式是 JDK8 的一个新特性,也被称为闭包,Lambda表达式允许把函数

Java Lambda表达式是jdk8引入的,是一个比较重要的特性

Lambda表达式简介

Lambda 表达式是 JDK8 的一个新特性,也被称为闭包,Lambda表达式允许把函数作为一个方法的参数,即行为参数化,函数作为参数传递进方法中。

Lambda表达式可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。

Lambda表达式的作用

Java 8 引入的 Lambda表达式的主要作用就是简化代码,写出更优雅的代码。

怎么一个简化优雅呢,举一Lambda语法创建线程和匿名内部类创建线程的例子,就非常清楚了。

1.匿名类创建线程

// JDK7匿名内部类写法
new Thread(new Runnable() {//接口名
        @Override
        public void run() {//方法名
            System.out.println("mikechen");
        }
    });

2.Lambda表达式创建线程

// JDK8 Lambda来创建线程
new Thread(() -> System.out.println("mikechen"));

上述代码跟匿名内部类的作用是一样的,但比匿名内部类更进一步,这里连接口名和函数名都一同省掉了,Lambda表达式可以取代匿名内部类,写出更优雅的代码。

Lambda表达式的语法

lambda 表达式的语法格式如下:

Java Lambda表达式详解(非常全面)-mikechen的互联网架构

  • ():左侧部分指定了Lambda表达式需要的所有参数。
  • ->:Lambda表达式的操作符或者箭头操作符。
  • {}:右侧部分指定了Lambda体,即方法需要实现的内容。

Java Lambda表达式详解(非常全面)-mikechen的互联网架构

1.无参数

Lambda体只有一条语句:

示例:

() -> System.out.println("mikechen");

请注意,括号中没有内容。那就是表示lambda不带任何参数。

2.一个参数

示例:

Consumer<String> con = (x) -> System.out.println(x);

当lambda表达式是单个参数时,也可以省略括号,如下所示:

Consumer<String> con = x -> System.out.println(x);

3.多个参数

如果Java lambda表达式匹配的方法有多个参数,则需要在括号内列出这些参数,代码如下:

BinaryOperator<Integer> bo = (a, b) -> {
    System.out.println("函数式接口");
    return a + b;
};

注意:仅当方法是单个参数时,才可以省略括号。

4.指定参数类型

如果编译器无法从lambda匹配的函数式接口抽象方法推断参数类型,则有时可能需要为lambda表达式指定参数类型。

(Car car) -> System.out.println("The car is: " + car.getName());

如你所见,car参数的类型(Car)写在参数名称的前面,就像在其他方法中声明参数或对接口进行匿名实现时一样。

5.只有一条语句时

当Lambda体只有一条语句时,return和大括号可以省略,示例:

BinaryOperator<Integer> bo = (a, b) -> a + b;

6.参数类型不写

Lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器能够通过上下文推断出数据类型,这就是“类型推断”,示例:

BinaryOperator<Integer> bo = (Integer a, Integer b) -> {
    return a + b;
};

等同于

BinaryOperator<Integer> bo = (a, b) -> {
    return a + b;
};

上述 Lambda 表达式中的参数类型都是由编译器推断得出,Lambda 表达式中无需指定类型,程序依然可以编译,这是因为 javac 根据程序的上下文,在后台推断出了参数的类型。

Lambda 表达式的类型依赖于上下文环境,是由编译器推断出来的,这就是所谓的“类型推断”。

7.Lambda表达式返回值

你可以从Java lambda表达式返回值,就像从方法中返回值一样。你只需向lambda表达式主体添加一个return,如下所示:

(param) -> {
    System.out.println("param: " + param);
    return "return value";
}

函数式接口

Lambda表达式需要函数式接口的支持,所以,我们有必要来说说什么是函数式接口。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface {}

一种用于表示一个接口是Java语言规范定义的函数式接口的注解类型。

对于函数式接口,我们可以理解为只有一个抽象方法的接口,除此之外它和别的接口相比并没有什么特殊的地方。

public interface MyFunctionInterface<T> {
    public T getValue(T t);
}

为了确保函数式接口的正确性,我们可以给这个接口添加@FunctionalInterface注解,这样当其中有超过一个抽象方法时就会报错。

Unexpected @FunctionalInterface annotation
@FunctionalInterface ^ WorkerInterface is not a functional interface multiple
non-overriding abstract methods found in interface WorkerInterface 1 error

Java 8中每一个Lambda表达式必须有一个函数式接口与之对应,也就是说,只要一个对象是函数式接口的实例,那么该对象就可以用Lambda表达式来表示。

Lambda表达式的举例

学习 Lambda 表达式的最好方式是学习例子,下面我们看几个比较常用的例子。

1.lambda创建线程

使用() -> {} 替代匿名类:

//JDK 8之前
new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("使用匿名内部类,开线程");
    }
}).start();

//JDK 8 使用lambda表达式
new Thread(() -> System.out.println("使用lambda表达式,开线程")).start();

2.lambda事件处理

使用lambda表达式如下所示写出更好的事件侦听器的代码:

// Java 8之前:
button.addActionListener(new ActionListener() {
    @Override
    public void actionPerfORMed(ActionEvent e) {
        System.out.println("Button被点击了使用老的方式!");
    }
});

// Java 8方式:
button.addActionListener( (e) -> {
    System.out.println("Button被点击了使用Lambda表达式!");
});

3.lambda遍历List集合

集合的遍历,采用lambda表达式会更简洁:

// Java 8之前:
List features = Arrays.asList("Lambdas", "Default Method", "Stream api", "Date and Time API");
for (String feature : features) {
    System.out.println(feature);
}

// Java 8之后:
List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
features.forEach(n -> System.out.println(n));

// 使用Java 8的方法引用更方便,方法引用由::双冒号操作符标示,
features.forEach(System.out::println);

方法引用是使用两个冒号::这个操作符号。

4.元素排序

之前我们若要为集合内的元素排序,就必须调用 sort 方法,传入比较器重写 compare。

方法的比较器对象,现在我们还可以使用 lambda 表达式来简化代码。

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("d");
    list.add("b");
    list.add("c");
    list.sort((o1,o2)->o1.compareTo(o2));
    list.forEach(System.out::println);
}

5.lambda Map

// 不使用lambda表达式为每个订单加上12%的税
List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
for (Integer cost : costBeforeTax) {
    double price = cost + .12*cost;
    System.out.println(price);
}
// 使用lambda表达式
List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
costBeforeTax.stream().map((cost) -> cost + .12*cost).forEach(System.out::println);

6.lambda过滤String

// 创建一个字符串列表,每个字符串长度大于2
List<String> filtered = strList.stream().filter(x -> x.length()> 2).collect(Collectors.toList());
System.out.printf("Original List : %s, filtered list : %s %n", strList, filtered);

7.lambda对集合应用函数

// 将字符串换成大写并用逗号链接起来
List<String> G7 = Arrays.asList("USA", "Japan", "France", "Germany", "Italy", "U.K.","Canada");
String G7Countries = G7.stream().map(x -> x.toUpperCase()).collect(Collectors.joining(", "));
System.out.println(G7Countries);

8.lambda计算最大值、最小值、平均值

//获取数字的个数、最小值、最大值、总和以及平均值
List<Integer> primes = Arrays.asList(2, 3, 5, 7, 11, 13, 17, 19, 23, 29);
IntSummaryStatistics stats = primes.stream().mapToInt((x) -> x).summaryStatistics();
System.out.println("Highest prime number in List : " + stats.getMax());
System.out.println("Lowest prime number in List : " + stats.getMin());
System.out.println("Sum of all prime numbers : " + stats.getSum());
System.out.println("Average of all prime numbers : " + stats.getAverage());

以上就是Java Lambda表达式详解的详细内容,更多关于Java Lambda表达式详解的资料请关注编程网其它相关文章!

--结束END--

本文标题: JavaLambda表达式详解

本文链接: https://lsjlt.com/news/196733.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JavaLambda表达式详解
    Java Lambda表达式是JDK8引入的,是一个比较重要的特性 Lambda表达式简介 Lambda 表达式是 JDK8 的一个新特性,也被称为闭包,Lambda表达式允许把函数...
    99+
    2023-02-18
    Java Lambda表达式详解 Java Lambda表达式创建线程 Java Lambda表达式的语法 Java lambda遍历List集合 Java lambda过滤String
  • JAVALambda表达式与函数式接口详解
    Lambda表达式的诞生是为了解决JAVA创建匿名内部类代码冗余的问题。例子如下: public class Lambda { public static void main...
    99+
    2024-04-02
  • JavaLambda表达式超详细介绍
    目录一、背景1.Lambda表达式的语法2.函数式接口二、Lambda表达式的基本使用三、语法精简四、变量捕获五、Lambda在集合当中的使用1.Collection接口六、List...
    99+
    2024-04-02
  • JavaLambda表达式实例解析原理
    目录1、实例解析2、InvokeDynamic2.1 方法调用2.2 指令规范2.3 执行过程2.4 MethodHandle1、实例解析 先从一个例子开始: public clas...
    99+
    2023-03-14
    Java Lambda表达式 Java Lambda原理
  • JavaLambda表达式与引用类浅析
    Lambda表达式和方法引用是一对孪生兄弟 而引用类方法是Lambda支持的方法引用中的一种 引用类方法其实就是引用类的静态方法 直接上代码 首先 我们要创建一个包 包下创建一个接口...
    99+
    2023-01-29
    Java Lambda表达式 Java引用类
  • Lambda表达式详解
    Lambda表达式 1. 为什么使用lambda表达式2. 入门案例3. lambda表达式组成4. lambda表达式使用4.1 语法格式一4.2 语法格式二4.3 语法格式三4.4 语法格...
    99+
    2023-09-01
    java jvm 算法
  • python3 lambda表达式详解
    技术背景 lambda表达式本身是一个非常基础的python函数语法,其基本功能跟使用def所定义的python函数是一样的,只是lambda表达式基本在一行以内就完整的表达了整个函数的运算逻辑。这里我们简单展示一些...
    99+
    2022-06-02
    python的lambda函数 python中lambda的用法 python lambda函数怎么用
  • 详解SqlServer 表达式(expression)
    2   具体内容  2.1  使用范围 SQL Server(2008开始) ;Azure SQL数据库;Azure  SQL数据仓库;并行数据仓库 2.2...
    99+
    2024-04-02
  • java lambda表达式详解
    一、Lambda初识 我们知道,在Java中,接口是不能实例化的,但是接口对象可以指向它的实现类对象。如果接口连实现对象都没有呢?那还可以使用匿名类的方式,如下: public class JavaTest { public ...
    99+
    2023-09-15
    java servlet jvm
  • C++Lambda表达式详解
    目录概述语法分析捕获列表关键字声明示例捕获列表按值传递总结概述 C++ 11 中的 Lambda 表达式用于定义并创建匿名的函数对象,以简化编程工作。Lambda 的语法形式如下: ...
    99+
    2024-04-02
  • C++表达式求值详解
    目录一.细节处理:1.注意负数 因此要进行字符串预处理2.考虑除数为03.原字符串再加上一个定界符 '#'4.优先级:二.知识要点:三.完整源码:四.测试结果:总结一.细节处理: 1...
    99+
    2024-04-02
  • spring之SpEL表达式详解
    目录1.什么是SpEL表达式2.SpEL表达式语言入门程序(1)xml配置的方式(2)采用注解的方式3.分析器4.使用SpEL表达式调用方法(1)使用SpEL调用普通方法(2)使用S...
    99+
    2024-04-02
  • Ruby正则表达式详解
    目录Ruby 正则表达式语法实例正则表达式修饰符正则表达式模式 正则表达式实例字符 字符类 特殊字符类 重复 非贪婪重复 ...
    99+
    2023-05-15
    Ruby 正则表达式 Ruby 正则表达式详解 Ruby 正则表达式实例
  • Python 正则表达式详解
    目录1.正则表达式是什么2.1用正则表达式2.2匹配原理2.3常用函数总结1.正则表达式是什么 很简单就是一种字符串匹配,eg: 比如你在注册账户时我们需要对用户的用户名判断是否合法...
    99+
    2024-04-02
  • JavaScript 正则表达式详解
    目录1. 正则表达式创建2. 使用模式2.1 使用简单模式2.2 使用特殊字符3. 应用3.1 切分字符串3.2 分组3.3 贪婪匹配3.4 正则表达式标志3.5 test() 方法...
    99+
    2024-04-02
  • Java 正则表达式详解
    正则表达式(Regular Expression),又称为正规表达式、规则表达式、常规表示法等,是一种用来匹配、查找和替换字符串的工...
    99+
    2023-08-16
    Java
  • Java中缀表达式转后缀表达式流程详解
    目录一、栈1、栈的基本介绍2、栈的底层实现二、中缀表达式转后缀表达式1、拆解中缀表达式2、中缀转后缀的算法3、中缀转后缀代码解析4、对后缀表达式进行计算一、栈 1、栈的基本介绍 栈是...
    99+
    2024-04-02
  • Python中正则表达式详解
    基础篇 正则表达式在python中运用的非常多,因为他可以进行任意的匹配,可以匹配我们想要提取的信息。当我们接触正则的时候你就会知道正则的强大。正则有一个库re 在一些工程中我们会经常调用正则的库来做与匹配...
    99+
    2022-06-04
    详解 正则表达式 Python
  • Python3的正则表达式详解
    目录1.简介2.切分字符串3.分组4.贪婪匹配5.编译总结1.简介 # 正则表达式:用来匹配字符串的武器; # 设计思想:用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符...
    99+
    2024-04-02
  • Java 8的Lambda表达式详解
    本篇内容介绍了“Java 8的Lambda表达式详解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!功能接口只包含一个方法的接口被称为功能接口...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作