一、Lamdba 表达式与函数式接口

一、Lamdba 表达式与函数式接口

1.1 Lamdba 表达式与函数式接口

1.1.1 Lambda 表达式概述

  • Lambda 表达式是 Java 8 引入的一个新特性
  • Lambda 表达式可以被视为匿名函数
  • 允许在需要函数的地方以更简洁的方法定义功能
  • Lambda 表达式可以完成简洁的函数定义
  • Stream API 中大量使用了 Lambda 表达式,可以使用 Lambda 表达式对集合进行操作
  • Lambda 表达式允许你将函数作为参数传递传递给其它函数,或将函数组合在一起形成新的函数

1.1.2 使用 Lambda 表达式实现接口

  • 首先定义一个接口
java 复制代码
interface MyInterface {
    int sum(int x,int y);
}
public class Main {
    public static void main(String[] args) {

    }
}
  • 使用 Lambda 表达式实现接口
java 复制代码
interface MyInterface {
    int sum(int x,int y);
}
public class Main {
    public static void main(String[] args) {
        MyInterface myInterface = (int x,int y) ->{
            return x+y;
        };
        System.out.println(myInterface.sum(1, 2));
    }
}

1.1.3 函数式接口概述

  • 接口中只有一个未实现的方法,被称为函数式接口
  • 只要是函数式接口,就可以使用 Lambda 表达式
  • 在 Java 中可以使用 @FunctionalInterface 来表示函数式接口

1.1.4 Lambda 表达式简写形式

1、参数类型可以不写,只写参数名

java 复制代码
 MyInterface myInterface = (x,y) ->{
            return x+y;
        };

2、参数变量名也可以随意定义,但是参数数量一定要一致

java 复制代码
 MyInterface myInterface = (i,j) ->{
            return x+y;
        };

3、如果只有一个参数,可以不写小括号,但没有参数一定要写小括号

java 复制代码
 MyInterface myInterface1 = i ->{
            return i;
};
 MyInterface myInterface2 = () ->{
            return 1;
};

4、方法体如果只有一句话,可以省略 {}

java 复制代码
 MyInterface myInterface = i -> return i;

1.2 Function PAI 函数式接口

1.2.1 Function 函数式接口概述

  • Function API 是 Java 函数式接口的底层定义
  • Function API 包括了许多不同种类类型的函数式接口
  • 以支持各种函数式编程风格和操作

1.2.2 Function API 不同类型的函数式接口

以下是 Function API 内置的函数式接口

  • 其中标红的四个接口 Consumer、Function、Perdicate、Supplier 是四个常见的函数式接口
  • 它们四个代表了函数式编程中的不同类型
    • Consumer 接口 表示接受一个参数并无返回值操作,被称为消费者
    • Function 接口 表示接受一个参数并返回一个结果的函数,通常被视为常用的函数接口
    • Perdicate 接口表示接受一个参数并返回一个布尔值,被称为断言
    • Supplier 接口表示无参数并返回一个结果,并成为提供者

1.2.3 使用 Function 不同类型的接口完成小案例

小案例

1.使用 Supplier 生成一个字符串数据

2.使用 Predicate 验证输入字符串是否为数字

3.使用 Function 转换数据,将字符串转为数字

4.使用 Consumer 判断数字是奇数还是偶数

5.将上面一系列操作串联起来

每个函数式接口当中都有一个方法,需要调用,如果不清楚方法名,可找到这个接口自行查看

1、使用 Supplier 生成一个字符串数据

java 复制代码
package org.example;

import java.util.function.Supplier;

public class FunctionDemo {
    public static void main(String[] args) {
        //生成一个字符串数据
        Supplier<String> supplier=() -> "42";
        System.out.println(supplier.get());
    }
}

2、使用 Predicate 验证输入字符串是否为数字

java 复制代码
package org.example;

import java.util.function.Predicate;
import java.util.function.Supplier;

public class FunctionDemo {
    public static void main(String[] args) {
        //验证输入字符串是否为数字
        Predicate<String> predicate=str -> str.matches("-?\\d+(\\.\\d+)?");
        System.out.println(predicate.test("435"));
        System.out.println(predicate.test("435a"));
    }
}

3、转换数据,将字符串转为数字

java 复制代码
package org.example;

import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

public class FunctionDemo {
    public static void main(String[] args) {
        //转换数据,将字符串转为数字
        Function<String,Integer> function= Integer::parseInt;
        Integer num = function.apply("435");
        System.out.println(num);
    }
}

4、判断数字是奇数还是偶数

java 复制代码
package org.example;

import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

public class FunctionDemo {
    public static void main(String[] args) {
        //判断数字是奇数还是偶数
        Consumer<Integer> consumer=integer -> {
          if (integer %2 == 0){
              System.out.println("偶数"+integer);
          }else {
              System.out.println("奇数"+integer);
          }
        };
        consumer.accept(44);
    }
}

5、将这些操作串联起来,实现判断 Supplier 生成的字符串是奇数还是偶数

java 复制代码
package org.example;

import java.util.Scanner;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

public class FunctionDemo {
    public static void main(String[] args) {
        //生成一个字符串数据
        Supplier<String> supplier=() -> "42";
        //验证输入字符串是否为数字
        Predicate<String> predicate=str -> str.matches("-?\\d+(\\.\\d+)?");
        //转换数据,将字符串转为数字
        Function<String,Integer> function= Integer::parseInt;
        //判断数字是奇数还是偶数
        Consumer<Integer> consumer=integer -> {
          if (integer %2 == 0){
              System.out.println("偶数"+integer);
          }else {
              System.out.println("奇数"+integer);
          }
        };

        //将这些操作串联起来,实现判断 Supplier  生成的字符串是奇数还是偶数
        if(predicate.test(supplier.get())){
            consumer.accept(function.apply(supplier.get()));
        }else {
            System.out.println("非法数字");
        }
    }
}

6、也可以将他们全部组合成一个方法

java 复制代码
package org.example;

import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

public class FunctionMethod {
    public static void main(String[] args) {
        myMethod(() -> "4aaa",
                str -> str.matches("-?\\d+(\\.\\d+)?"),
                Integer::parseInt,
                integer -> {
                    if (integer %2 == 0){
                        System.out.println("偶数"+integer);
                    }else {
                        System.out.println("奇数"+integer);
                    }
                });
    }
    private static void myMethod(
            Supplier<String> supplier,
            Predicate<String> predicate,
            Function<String,Integer> function,
            Consumer<Integer> consumer
    ){
        if(predicate.test(supplier.get())){
            consumer.accept(function.apply(supplier.get()));
        }else {
            System.out.println("非法数字");
        }
    }
}
复制代码
       Function<String,Integer> function,
        Consumer<Integer> consumer
){
    if(predicate.test(supplier.get())){
        consumer.accept(function.apply(supplier.get()));
    }else {
        System.out.println("非法数字");
    }
}

}

复制代码
相关推荐
X***07886 小时前
从语言演进到工程实践全面解析C++在现代软件开发中的设计思想性能优势与长期生命力
java·开发语言
smileNicky7 小时前
SpringBoot系列之集成Pulsar教程
java·spring boot·后端
Sammyyyyy7 小时前
Rust 1.92.0 发布:Never Type 进一步稳定
java·算法·rust
alonewolf_997 小时前
深入解析G1与ZGC垃圾收集器:原理、调优与选型指南
java·jvm·算法
小镇学者7 小时前
【c++】C++字符串删除末尾字符的三种实现方法
java·开发语言·c++
rfidunion7 小时前
springboot+VUE+部署(1。新建项目)
java·vue.js·spring boot
小翰子_7 小时前
Spring Boot整合Sharding-JDBC实现日志表按月按周分表实战
java·spring boot·后端
weixin_399380697 小时前
OA 系统假死问题分析与优化
java·运维
豆沙沙包?8 小时前
2026年--Lc334-2130. 链表最大孪生和(链表转数组)--java版
java·数据结构·链表
柒.梧.8 小时前
SSM常见核心面试问题深度解析
java·spring·面试·职场和发展·mybatis