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

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

1.1 Lamdba 表达式与函数式接口

1.1.1 Lambda 表达式概述

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

1.1.2 使用 Lambda 表达式实现接口

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

    }
}
  • 使用 Lambda 表达式实现接口
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、参数类型可以不写,只写参数名

 MyInterface myInterface = (x,y) ->{
            return x+y;
        };

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

 MyInterface myInterface = (i,j) ->{
            return x+y;
        };

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

 MyInterface myInterface1 = i ->{
            return i;
};
 MyInterface myInterface2 = () ->{
            return 1;
};

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

 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 内置的函数式接口

image-20240123200328203

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

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

小案例

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

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

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

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

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

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

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

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 验证输入字符串是否为数字

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、转换数据,将字符串转为数字

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、判断数字是奇数还是偶数

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 生成的字符串是奇数还是偶数

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、也可以将他们全部组合成一个方法

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("非法数字");
    }
}

}