首页 > 其他分享 >JDK8新特性之Lambda表达式和四大函数接口

JDK8新特性之Lambda表达式和四大函数接口

时间:2023-09-21 11:37:49浏览次数:44  
标签:void 接口 JDK8 参数 Supplier public 表达式 Lambda

在Java8中,加入了Lambda(Lambda expression),在使用它以前我们先聊聊为什么要加入Lamdba,使用它对于编程上有什么好处 

一、Lamdba的作用

1.在我们需要把一些功能传递给某些方法时,在 Java 8 以前,我们就需要去写匿名内部类。引入lambda表达式后,你可以在一个类中简便的定义参数和方法,替代大部分匿名内部类和功能接口,使得代码更加优雅,Lambda提供了一个参数列表和只用这些参数的功能体,也被称为闭包。

二、使用Lambda表达式要知道的规范

1.一个Lambda必须对应一个接口,并且这个接口是有要求的,这个接口只能被实现一个方法,如果写了多个方法,在写Lambda表达式的时候就会报不是只有一个抽象方法在接口内。无法使用lambda进行编码。

2.如何让程序知道接口是函数型的呢,需要在接口上添加@Functionallnterface注解。

三、Lambda表达式格式

1.语法形式为 () -> {},其中()为参数列表,{}为方法体,->是一个Lambda表达式,可以理解为一个箭头,为{}方法体中的方法提供参数。

首先创建两个接口

@FunctionalInterface
public interface LambdaNoreture2 {    
    void method(string a,string b);
}
@FunctionalInterface
public interface LambdaNoreture1 {    
    void method(string a);
}

Lambda表达式基本格式(参数a,参数b)->{方法体}

public class Lambda {
    public static void main(String[] args) {
        LambdaNoreture2 lambdaNoreture2=(String a,String b)->{
            System.out.println("Hello" + a + b +"!");        
};
        lambdaNoreture2.method("Lam","bda");
}
//输出HelloLambda!

Lambda简写方式:如果参数和方法都只有一个那么可以省略掉圆括号()和大括号{};如果多个或一个参数类型一样,可以不写参数类型,如下。

public class Lambda {
    public static void main(String[] args) {
        LambdaNoreture1 lambdaNoreture1=a->
            System.out.println("Hello" + a + b +"!");        

        lambdaNoreture1.method("Lam","bda");
}
//输出HelloLambda!

四、因为每次要用到Lambda表达式都要创建一个相应的函数式接口,很麻烦,所以JDK8贴心的给我们做好了一些函数式接口,大部分情况下我们就不用新建接口了,直接用就可以,其中我们主要学习下四个最常用的接口;

1.第一个函数式接口Function<T,R>, Fcuntion接口会接收一个T(泛型)类型参数,返回R类型的结果的方法,通过调用apply方法执行内容。下面的例子是用Fcuntion来表白的例子

import java.util.function.Function;
public class LambdaFcuntion {
    public static void main(String[] args) {
        Function<Double,Double> S=r->r*r*3.14+67.84;        System.out.println(S.apply(12.0));    
    }
}
//输出:520.0

2.Predicate接口predicate<T,Boolean>,Predicate接口是一个用于判断的接口,平常可以用来当过滤器使用,有一个参数和一个布尔类型的返回值,下面是一个判断是否成人的例子。

import java.util.function.Predicate;
public class LambdaPredicate {
    public static void main(String[] args) {
        Predicate<Integer>  predicate=age->age>=18;
        System.out.println(predicate.test(5));
        System.out.println(predicate.test(20));    
    }
}
//test(5)输出结果:false
//test(20)输出结果:true

3.Consume接口,Consum也叫消费接口,该接口对应的方法类型为接收一个参数,没有返回值,下面是一个例子。

import java.util.function.Consumer;
public class Consum {
    public static void main(String[] args) {
        Consumer<String> printString = s -> System.out.println(s);
        printString.accept("消费成功,这是你的Consumer");
    }
}
//输出结果:消费成功,这是你的Consumer

4.Supplier接口, 和Consume相反,他没有参数、只有返回值,所以也叫给予接口,可以使用get()方法获得这个返回值,下面是一个例子。

import java.util.function.Supplier;
public class Supplier{
    public static void main(String[] args) {
        Supplier<String> Supplier = () ->"I get Supplier";
        System.out.println(Supplier.get());
    }
}
//输出结果:I get Supplier


标签:void,接口,JDK8,参数,Supplier,public,表达式,Lambda
From: https://blog.51cto.com/u_16273836/7550452

相关文章

  • Oracle正则表达式函数
    1、正则表达式中的元字符元字符意思例子\说明要匹配的字符是一个特殊字符、常量或者后者引用。(后引用重复上一次的匹配)\n匹配换行符\\匹配\\(匹配(\)匹配)^匹配字符串的开头位置如果A是字符串的第一个字符,^A匹配A$匹配字符串的末尾位置如果B是字符......
  • Python实现排序的方式有:内置函数sort()和sorted()以及lambda函数
    排序是计算机编程中经常需要用到的操作,它将一组数据按照规则重新排列,以便更好地处理数据。在Python中,有多种方法可以对数组进行排序,本文将从多个方面进行介绍。一、Python中的排序方法Python中内置了多个排序算法,包括冒泡排序、插入排序、选择排序、快速排序等。使用内置的sort(......
  • linux中正则表达式仅保留绝对路径的目录
     001、方法1[root@pc1test2]#lsa.txt[root@pc1test2]#cata.txt##测试文件/home/test2/a.txt[root@pc1test2]#sed-r's/(\/.*\/).*/\1/'a.txt##仅保留路径/home/test2/ ......
  • 关于正则表达式 g,m 参数的总结,为了回答“正则表达式(/[^0-9]/g,'')中的"/g"是什么意
    为了解答“正则表达式(/[^0-9]/g,'')中的"/g"是什么意思?”这个问题,也为了能够便于大家对正则表达式有一个更为综合和深刻的认识,我将一些关键点和容易犯糊涂的地方再系统总结一下。 总结1:附件参数g的用法 表达式加上参数g之后,表明可以进行全局匹配,注意这里“可以”的含义。我们详......
  • Lambda表达式
    作用:用于简化匿名内部类代码的书写。Lambda表达式基本使用怎么去简化呢?Lambda是有特有的格式的,按照下面的格式来编写Lamdba。(被重写方法的形参列表)->{被重写方法的方法体代码;}需要给说明一下的是,在使用Lambda表达式之前,必须先有一个接口,而且接口中只能有一个抽象......
  • 支持SpEL表达式的自定义日志注解@SysLog介绍
    目录序言预期思路过程结果序言之前封装过一个日志注解,打印方法执行信息,功能较为单一不够灵活,近来兴趣来了,想重构下,使其支持表达式语法,以应对灵活的日志打印需求。该注解是方法层面的日志打印,如需更细的粒度,还请手撸log.xxx()。预期通过自定义注解,灵活的语法表达式,拦......
  • JDK8升级JDK11最全实践干货来了
    1、前言截至目前(2023年),Java8发布至今已有9年,2018年9月25日,Oracle发布了Java11,这是Java8之后的首个LTS版本。那么从JDK8到JDK11,到底带来了哪些特性呢?值得我们升级吗?而且升级过程会遇到哪些问题呢?带着这些问题,本篇文章将带来完整的JDK8升级JDK11最全实践。2、为什么升级JDK111)性......
  • C++系列十:日常学习-Lambda表达式
    目录前言必备理论知识:例子:前言有C#经验,使用起来,驾轻就熟。就是语法糖。但是也要熟悉用法,才好众享丝滑。内容参考:Chatjpt、文心一言必备理论知识:捕获列表:[]:默认不捕获任何变量;[=]:默认以值捕获所有变量;内部有一个相应的副本[&]:默认以引用捕获所有变量;[x]:仅以值捕获x,其它......
  • centos7安装jdk8
    1.卸载centos7自带的jdk通过以下命令查看是否已经安装jdkyumlistinstalled|grepjava如果安装了则通过以下命令删除yum-yremove#名称2.安装jdk通过以下命令查找能够安装的jdk版本yum-ylistjava*通过以下命令安装jdk1.8yuminstalljava-1.8.0-openjdk.x86_64......
  • Lua06——Lua表达式
    1算术运算符lua中的算术运算符如下表运算符说明+加法-减法*乘法/除法//整除,对除数取整,舍去所有小数部分^指数(幂计算)%取模(求余计算)print(10+2)print(10-2)print(10*2)print(9/2)print(9//2)print(9%2)print(10^2)执行后输出如下:128204.541100.02关系运......