Java中Lambda表达式和函数式接口的使用和特性

作者:_BugMan 时间:2023-06-20 20:05:42 

1.概述

当Java 8发布时,其中最令人兴奋的特性之一就是 Lambda 表达式。Lambda 表达式是一种轻量级、简洁和高效的函数式编程方法。它可以用来代替 Java 旧有的匿名内部类,提高代码的可读性和可维护性。

2.lambda表达式的基础

Lambda 表达式是一个匿名函数,由输入参数和处理逻辑两部分组成:

(parameter1, parameter2, ...) -> { code block }

输入或者输出可以为空:

() -> System.out.println("Hello, world!")
(a) -> {}
() -> {}

多参数用括号,单参数可以不用括号:

(a,b) -> a+b
a -> System.out.print(a)

多条处理逻辑用花括号,单条处理逻辑可以不用花括号:

(a,b) -> a+b;
(a,b) -> {a+b;a-b;}

3.JAVA中的lambda表达式

要在 Java 中使用 Lambda 表达式,需要将它们赋值给一个函数式接口变量。函数式接口是只包含一个抽象方法的接口,它们提供了一种定义 Lambda 表达式类型的方式。例如,下面的函数式接口 MyInterface 包含了一个抽象方法 doSomething

interface MyInterface {
   void doSomething();
}

要使用 Lambda 表达式实现这个接口,只需要提供一个与 doSomething 方法签名匹配的 Lambda 表达式即可。例如,下面的代码使用 Lambda 表达式创建了一个 MyInterface 对象,并调用了它的 doSomething 方法:

MyInterface myLambda = () -> System.out.println("Hello, world!");
myLambda.doSomething();

在这个例子中,我们使用 Lambda 表达式创建了一个 MyInterface 对象,并将它赋值给了 myLambda 变量。然后,我们调用了 myLambda.doSomething() 方法,输出了 Hello, world!

4.函数式接口

内置函数式接口

概述

JDK8内置实现了一些常用的函数式接口:

接口作用
Function程序中映射逻辑的抽象
Predicate程序中判断逻辑的抽象
Consumer程序中的消费型逻辑的抽象
Suppiler程序中的生产逻辑的抽象

Function

Function接口,可以定义入参和出参的类型,可用于类型转换。

代码示例:

Function<String,Integer> function=(String i)-> Integer.parseInt(i);
System.out.println(function.apply("1")==1);

Predicate

Predicate接口,指定返回值为布尔类型,可用于断言。

public static void main(String[] args) {
       Predicate<String> predicate = (s) -> s.length() > 0;
       // 测试字符串的长度是否>0
       System.out.println(predicate.test("hello"));
       // 结果取反
       System.out.println(predicate.negate().test("hello"));
       System.out.println("=====or / and======");
       System.out.println(predicate.test(""));
       // 增加或判断,二者满足其一则为true
       System.out.println(predicate.or(s -> s.equals("")).test(""));
       // 增加与判断,二者都满足则为true
       System.out.println(predicate.and(s -> s.equals("hello")).test(""));
       System.out.println(predicate.and(s -> s.equals("hello")).test("hello"));
       System.out.println("=====isEqual======");
       // 判断是否相等
       System.out.println(Predicate.isEqual("hello").test(""));
       System.out.println(Predicate.isEqual("hello").test("hello"));
       Predicate<Boolean> nonNull = Objects::nonNull;
       Predicate<Boolean> isNull = Objects::isNull;
       Predicate<String> isEmpty = String::isEmpty;
       Predicate<String> isNotEmpty = isEmpty.negate();
   }

Consumer

Consumer接口,又叫消费接口,没有返回值,就像把输入消费掉了一样。

public static void main(String[] args) {
  Consumer<Object> consumer1 = new Consumer<Object>() {
  @Override
  public void accept(Object o) {
    System.out.println("这次消费了:" + o.toString());
    }
  };
  consumer1.accept("100w元在双十一!这下穷死了!");
  Consumer<String> consumer2 = s -> System.out.println("这次消费了:" + s);
  consumer2.accept("120w元在双十二!又穷死了!");
}

Suppiler

Suppiler接口,又叫生产接口,可以自定义返回值,用来生产一些东西。

public static void main(String[] args) {
   // 生成一个字符串
   Supplier<String> supplier1 = () -> "abcde";
   // 生成一个随机数
   Supplier<Integer> supplier2 = () -> new Random().nextInt(10);
   // 产生一个运行时异常
   Supplier<RuntimeException> supplier3 = () -> new RuntimeException();
   System.out.println(supplier1.get());
   System.out.println(supplier2.get().intValue());
   System.out.println(supplier3.get());
}

5.级联与柯里化

级联表达式,含有多个箭头的lambda表达式,即&ldquo;套娃&rdquo;lambda表达式。

以下列lambda表达式为例:

x->y->x+y

假设输入的为Integer类型,

用Function接口来表达即为:

输入一个Integer x,返回一个Integer y,

Integer y又可以用Function接口来表示为:

输入一个Integer,返回一个Integer

Function<Integer,Function<Integer,Integer>> functionFunction= x->y->x+y;
System.out.println(functionFunction.apply(2).apply(3));

来源:https://blog.csdn.net/Joker_ZJN/article/details/129535288

标签:Java,lambda,表达式,函数式接口
0
投稿

猜你喜欢

  • IDEA + Maven环境下的SSM框架整合及搭建过程

    2023-08-26 02:06:55
  • C#多线程之Thread中Thread.Join()函数用法分析

    2022-01-20 14:47:58
  • Android自定义TitleView标题开发实例

    2023-09-05 18:21:41
  • C++实现哈夫曼树编码解码

    2022-02-13 15:48:09
  • C语言深入浅出解析二叉树

    2022-05-12 11:28:21
  • Android九宫格程序设计代码

    2022-05-04 13:11:49
  • Spring-Bean创建对象的步骤方式详解

    2023-04-12 22:00:47
  • springboot使用之多个filter的执行顺序以及配置方式

    2023-11-09 09:30:59
  • Java对象的XML序列化与反序列化实例解析

    2023-02-25 15:21:19
  • Android中Canvas的常用方法总结

    2021-11-25 03:00:28
  • C# Cache缓存读取的设置方法

    2022-11-18 05:33:53
  • SpringBoot使用JWT实现登录验证的方法示例

    2023-09-19 19:12:10
  • springboot2.x 接入阿里云市场短信发送的实现

    2023-09-20 23:03:57
  • 使用mongoTemplate实现多条件加分组查询方式

    2022-05-21 01:41:51
  • Spring boot实现文件上传功能

    2023-08-01 07:00:02
  • Java超细致讲解数组的使用

    2022-07-20 06:25:16
  • Android实现仿360桌面悬浮清理内存

    2021-08-25 11:21:05
  • C#调用Oracle存储过程的方法

    2022-10-19 02:29:19
  • 基于SpringBoot实现图片上传及图片回显

    2023-01-17 06:26:15
  • Android Jetpack库剖析之LiveData组件篇

    2022-08-31 02:08:13
  • asp之家 软件编程 m.aspxhome.com