iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >java8新特性lambda表达式的语法是什么
  • 157
分享到

java8新特性lambda表达式的语法是什么

2023-07-05 11:07:06 157人浏览 八月长安
摘要

这篇“java8新特性lambda表达式的语法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“java8新特性lambd

这篇“java8新特性lambda表达式的语法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“java8新特性lambda表达式的语法是什么”文章吧。

定义

jdk8发布新特性中,lambda是一大亮点之一。lambda表达式能够简化我们对数据的操作,减少代码量,大大提升我们的开发效率。

Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。

Lambda表达式可以表示闭包。如果你之前了解Scalajs函数式编程,将会更加快速上手和学习java8的lambda新特性。

lambda表达式的语法

Lambda表达式在Java8中引入了一个新的语法操作符号,即:->,它将Lambda表达式分为两部分。

左侧

  • Lambda表达式左侧为入参参数。

右侧

  • Lambada表示式的右侧表示执行的功能。

总结就是:

(parameters) -> expression或(parameters) ->{ statements; }

以下是Lambda表达式几种语法格式:

无参,无返回值,典型的一个例子是Runnable匿名内部类的使用。

// java 8之前的写法Runnable runnable = new Runnable() {    @Override    public void run() {        System.out.println(Thread.currentThread().getName() + " >---Lambda");    }};// 使用lambda的写法Runnable r = () -> System.out.println(Thread.currentThread().getName() + " >---Lambda");

一个参数的使用

// java 8 之前的写法Consumer<String> consumer = new Consumer<String>() {     @Override    public void accept(String s) {         System.out.println(s);       }    }; // Lambda表达式的写法Consumer<String> consumer = (par)->System.out.println(par);consumer.accept("xixi");一个参数的小括号可以省略,简化如下:Consumer<String> consumer = par->System.out.println(par);

两个参数的使用

// java 8之前的写法Comparator<Integer> comparator = new Comparator<Integer>() {    @Override    public int compare(Integer o1, Integer o2) {       return o1.compareTo(o2);     } }; // 使用Lambda表达式的方法 ,当只有一条语句的时候,大括号和return都可以省略  Comparator<Integer> comparator=(x,y) -> x.compareTo(y);

观察上面的代码后,我们发现使用Lambda表达式,在Lambda表达式中并没有指定入参的参数类型。这个编译和运行没有报错,这个是怎么判断出来的呢?

很简单是类型推断的作用,java8中有个很大的变化,就是类型推断,简单来说javac在编译代码时候,会根据程序的上下文来推断出Lambda表达式参数类型。

例如上文中的下面这个代码:

Comparator<Integer> comparator=(x,y) -> x.compareTo(y);

这里在编译的时候,在执行x.compareTo(y)的时候根据类型推断,因为这个接口定义数据的泛型是Intger,所以根据类型推断会自动调用Integer.compareTo方法。

为理解lambda表达式的作用,以及简化我们开发。这儿将会举个小小的例子。

需求

王小明所在的公司,每一个月都会进行薪资财务报表,王小明每一个月都会自己对员工们的薪资做统计,以了解公司财务支出和订单提成等需求。常常有做订单提成排名和总工资排名的这样的一个需求。

我们将定义以下类,来完成王小明的统计需求。

基本员工类

package com.codegeek.lambda;import lombok.*;@Setter@Getter@NoArgsConstructor@ToStringpublic class Employee {        private String name;        private int age;        private double basicSalary;        private double dealTotalPrice;    public Employee(String name, int age, double basicSalary,double dealTotalPrice) {        this.name = name;        this.age = age;        this.basicSalary = basicSalary;        this.dealTotalPrice = dealTotalPrice;    }        public Double getTotalSalary() {        return this.basicSalary + this.dealTotalPrice * 0.04;    }}

现在假设在A部门有,青龙,白虎,朱雀,玄武 四个部门人员。下面是他们上个月基本薪资的情况。

Employee qingLong = new Employee("青龙", 25, 5500, 7500);Employee baiHu = new Employee("白虎", 27, 5000, 9000);Employee zhuQue = new Employee("朱雀", 22, 3800, 4500);Employee xuanWu = new Employee("玄武", 24, 3300, 3300);List<Employee> employees = Arrays.asList(qingLong, baiHu, zhuQue, xuanWu);

现在有个统计的需求是,按员工年龄从小到大排列,并获取员工姓名列表。让我们分别使用Lambda表达式和java8之前的做法。

java8之前通常的做法

// 员工列表先进行排序employees.sort(new Comparator<Employee>() {  @Override  public int compare(Employee o1, Employee o2) {     Integer age1 = o1.getAge();     Integer age2 = o2.getAge();     return age1.compareTo(age2); }});// 遍历排序后的列表并输出员工姓名  for (Employee employee : employees) {    System.out.println(employee.getName()); }

使用Lambda的做法

employees.stream().sorted((o1, o2) -> o1.getAge().compareTo(o2.getAge())).forEach(o -> System.out.println(o.getName()));

看到这里我们一定知道Lambda表达式使用的方便,确实减少了很多代码的使用。

函数式接口

只包含一个抽象方法的接口,称为函数式接口。

使用Lambda表达式创建该对象接口的对象,如果Lambda抛出一个受检异常,通常需要在目标接口使用@FunctionalInterface注解,来声明标记了该注解的接口是一个函数式接口。

例如:

Consumer<String> consumer = par->System.out.println(par);

就是一个典型的消费型函数式接口。

java8新特性lambda表达式的语法是什么

注意观察该接口的源代码,只包含一个抽象的方法的接口是函数式接口,下面andThen是一个默认方法,并不属于抽象方法。不要被迷惑了。

内建函数式的接口

jdk8中默认定义了很多函数式接口,主要使用的有下面四个。

函数式接口参数类型返回类型使用说明
Consumer<T> 消费型接口Tvoid对类型T的数据进行操作,抽象方法 void accept(T t)
Supplier 供给型接口T返回类型T的对象,抽象方法 T get();
Function<T,R> 函数型接口TR对类型T对象进行操作,返回类型R的对象,抽象方法R apply(T t)
Predicate<T> 断言型接口Tbolean对类型T对象进行操作,返回类型boolean,抽象方法boolean test(T t)

四大函数式接口的使用

public class FourFunctionsTest {    // 消费式接口    @Test    public void testConsumer() {        Consumer<Integer> consumer = x -> System.out.println(x);        consumer.accept(1);    }    // 供给式接口    @Test    public void testSupplier() {        Supplier<String> supplier = () -> {            StringBuffer sb = new StringBuffer();            return sb.append("我").append(520).append("you").toString();        };        System.out.println(supplier.get());    }    // 断言式接口    @Test    public void testPredicate() {        Predicate<Long> predicate = x -> x == 1L;        System.out.println(predicate.test(2L));    }    // 函数式接口    @Test    public void testFunction() {        Function<Integer, Boolean> function = x -> x > 3;        System.out.println(function.apply(4));    }}

自定义函数式接口

上面我们举例A部门的四个员工,找出工资大于5000的员工。

// 使用策略式接口@FunctionalInterface // 函数式接口(检查)只能有一个抽象方法public interface MyFilter<T> {        boolean getWant(T t);}    public List<Employee> needEmployee(List<Employee> employeeList, MyFilter<Employee> filter) {   List<Employee> employees = new ArrayList<>();     for (Employee employee : employeeList) {        if (filter.getWant(employee)) {            employees.add(employee);        }     }      return employees; }// 匿名内部类List<Employee> employees1 = needEmployee(employees, new MyFilter<Employee>() {  @Override  public boolean getWant(Employee employee) {      return employee.getTotalSalary() >= 5000;   }});// 使用策略者设计模式Lambda简化needEmployee(employees, employee -> mployee.getTotalSalary() >= 5000);

看了上面代码,如果还想简化怎么做呢?这里可以使用java 8的Stream api可以大大简化以上繁多的代码。

employees.stream().filter(e -> e.getTotalSalary() > 5000d).map(Employee::getName).forEach(System.out::println);

看到这儿,可能刚刚入门的同学会懵逼,因为上面用了Stream相关的API以及(Employee::getName)中::表示什么含义呢?别着急,慢慢往下看。

方法引用

使用操作符::将方法名和对象或者类的名字分隔开,组合有以下三种。

  • 对象::实例方法名

  • 类::静态方法

  • 类::实例方法

常见的x-> System.out.println() 等同于System.out::println。 

注意:

  • Lambda 体中调用方法的参数列表与返回值类型,要与函数式接口抽象方法的该函数列表和返回值类型保持一致。

  • 若Lambda参数列表中的第一个参数是实例方法的调用者,而第二个参数是实例方法的参数时。可以使用 ClassName :: method

说起来比较抽象,请看下面的例子。

// 对象::实例方法    @Test    public void testConsumer() {        Employee emp = new Employee();        // 函数式接口Supplier是空参,返回是Integer类型的接口,        // 而对应emp的实例方法getAge()刚刚好是空参且返回Integer类型的数据,符合上面注意事项1的要求        Supplier<Integer> supplier = () -> emp.getAge();        Supplier<Double> sup2 = emp::getSalary;        System.out.println(supplier.get());    }    // 类::方法名    @Test    public void testSupplier() {        Comparator<String> comparator = (x, y) -> x.compareTo(y);        // 要求参数第一个值作为方法体的调用者,第二个参数值作为方法体的被调用者(参数)符合注意事项2的要求        Comparator<String> compString = String::compareTo;        System.out.println(comparator.compare("2", "3"));                Comparator<Integer> com = Integer::compare;        System.out.println(com.compare(1, 2));        BiPredicate<String, String> predicate = String::equals;        System.out.println(predicate.test("we", "eq"));    }

构造器引用

这儿以函数式接口为例:可以将返回的参数R,使用构造器的构造方法。

// 当Employee有下面的构造时候    public Employee(int age) {        this.age = age;    }

可构造以下这样的一个函数式接口。

Function<Integer,Employee> fun = i -> new Employee(i)System.out.println(fun.apply(13));// 使用构造器引用简化后:Function<Integer,Employee> fun = Employee::newSystem.out.println(fun.apply(15));

以上就是关于“java8新特性lambda表达式的语法是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: java8新特性lambda表达式的语法是什么

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java8新特性lambda表达式的语法是什么
    这篇“java8新特性lambda表达式的语法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“java8新特性lambd...
    99+
    2023-07-05
  • Java8新特性:lambda表达式总结
    一、Lambda 表达式的基础语法 Lambda 表达式的基础语法:Java8中引入了一个新的操作符 "->" 该操作符称为箭头操作符或 Lambda 操作符箭头操作符将 La...
    99+
    2022-11-12
  • Java8新特性-Lambda表达式详解
    目录一、简介 特征引入Lambda表达式的总结三、Lambda表达式的使用无参、无返回值有参无返回值无参数有返回值有参数有返回值四、Lambda表达式的注意事项 ...
    99+
    2023-05-16
    java8新特性 lambda表达式 java8 lambda表达式
  • Java8新特性之Lambda表达式的使用
    目录1. lambda表达式介绍2. lambda表达式的重要特征3. lambda表达式对域外变量的限制4. lambda表达式的优缺点5. lambda表达式的使用场景1. la...
    99+
    2022-11-12
  • java8中lambda表达式的语法是什么
    这篇文章主要介绍“java8中lambda表达式的语法是什么”,在日常操作中,相信很多人在java8中lambda表达式的语法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java8中lambda表达式...
    99+
    2023-07-02
  • Java8新特性Lambda表达式的一些复杂用法总结
    简介lambda表达式是JAVA8中提供的一种新的特性,它支持Java也能进行简单的“函数式编程”。 它是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一...
    99+
    2023-05-31
    java8 lambda表达式 ava
  • java8新特性-lambda表达式入门学习心得
    目录定义lambda表达式的语法需求函数式接口方法引用构造器引用总结定义 jdk8发布新特性中,lambda是一大亮点之一。lambda表达式能够简化我们对数据的操作,减少代码量,大...
    99+
    2023-03-13
    java8新特性 lambda表达式入门 java8 lambda表达式
  • Java8中函数式接口与Lambda表达式的特性
    今天就跟大家聊聊有关Java8中函数式接口与Lambda表达式的特性,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。什么是Lambda表达式,java8为什么使用Lambda表达式?“...
    99+
    2023-05-31
    java8 函数式接口 lambda
  • 简单易懂的java8新特性之lambda表达式知识总结
    目录一、概念二、用法比较2.1 实现类2.2 匿名类2.3 Lambda三、基本用法3.1 无参数无返回值接口方法3.2 一个参数无返回值接口方法3.3 多个参数无返回值接口方法3....
    99+
    2022-11-12
  • 深入理解Java8新特性之Lambda表达式的基本语法和自定义函数式接口
    1.写在前面 目前我们学习Java主要用到的应该就是Java8了,或者说大部分企业当前使用的也是Java8。那么既然Java8的应用如此之广泛,一定有一些亮点所在: Lam...
    99+
    2022-11-12
  • java lambda表达式的语法格式是什么
    Java的Lambda表达式的语法格式如下:(parameter1, parameter2, ...) -> {  ...
    99+
    2023-10-10
    java
  • java lambda表达式的语法特点有哪些
    Java lambda表达式的语法特点包括以下几点:1. 简洁:lambda表达式可以以更简洁的方式表示匿名函数。2. 参数列表:l...
    99+
    2023-09-23
    java
  • Java8和Scala中的Lambda表达式有什么不同
    本篇内容介绍了“Java8和Scala中的Lambda表达式有什么不同”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、为什么使用Lambd...
    99+
    2023-06-17
  • java lambda表达式的用法是什么
    Lambda表达式是Java 8中引入的一种新的语法特性,用于简化函数式编程的代码编写。Lambda表达式可以替代匿名内部类的使用,...
    99+
    2023-09-26
    java lambda
  • Java中Lambda表达式用法是什么
    本篇文章为大家展示了Java中Lambda表达式用法是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Lambdalambda是一个匿名函数,我们可以把lambda表达式理解为是一段可以传递的代码...
    99+
    2023-06-22
  • python lambda表达式的格式是什么
    本篇内容介绍了“python lambda表达式的格式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言:在日常开发的过程中...
    99+
    2023-06-29
  • Java中的Lambda表达式是什么
    这篇文章主要介绍“Java中的Lambda表达式是什么”,在日常操作中,相信很多人在Java中的Lambda表达式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的Lambda表达式是什么”的疑...
    99+
    2023-06-25
  • python lambda表达式的简单用法是什么
    python lambda表达式的简单用法是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。python lambda表达式简单用法习条件运算时,对于简单的 if els...
    99+
    2023-06-04
  • 一篇文章带你了解jdk1.8新特性--为什么使用lambda表达式
    目录一、为什么使用Lambda表达式二、匿名内部类的方式与Lambda表达式方式的比较(示例)三、需求演示示例一、创建一个员工实体类二、普通方式实现1、代码如下2、运行main函数,...
    99+
    2022-11-12
  • JDK7新特性的语法是什么
    JDK7新特性的语法是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。JDK7对Java语法有少量更新,重点是在易用性和便捷性的改进。1.二进制字面量JDK7...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作