【Java】函数式编程学习笔记——Lambda表达式


学习视频:https://www.bilibili.com/video/BV1Gh41187uR?p=1

(1)【Java】函数式编程学习笔记——Lambda表达式
(2)【Java】函数式编程学习笔记——Stream流
(3)【Java】函数式编程学习笔记——Optional
(4)【Java】函数式编程学习笔记——函数式接口、方法引用


文章目录

  • 1 函数式编程思想
  • 2 Lambda表达式
    • 2.1 概念
    • 2.2 举例

1 函数式编程思想

概念

面向对象思想需要关注用什么对象完成什么事情。而函数式编程思想就类似于我们数学中的函数。它主要关注的是对数据进行了什么操作。

优点

1 代码简洁,开发快速
2 接近自然语言,易于理解
3 易于"并发编程"

2 Lambda表达式

2.1 概念

Lambda是JDK8中的语法糖,它可以对某些匿名内部类的写法进行简化。它是函数式编程思想的一个重要体现。让我们不用关注是什么对象,而是更关注我们对数据进行了什么操作。关注的是参数列表和具体的逻辑代码体

省略规则

  • 参数类型可以省略
  • 方法体中只有一句代码时大括号return和唯一一句代码的分号可以省略
  • 方法只有一个参数时小括号可以省略0.

基本格式

(参数列表)->{代码}

2.2 举例

案例1

正常方法

new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("test");
    }
}).start();

使用Lambda表达式

new Thread(() -> {
    System.out.println("test");
}).start();

匿名内部类可以使用Lambda表达式进行简化的条件是:这个接口的抽象方法只有一个。

案例2

public static void main(String[] args) {
	// 匿名内部类实现
    int i = calculateNum(new IntBinaryOperator() {
        @Override
        public int applyAsInt(int left, int right) {
            return left + right;
        }
    });
    System.out.println(i);
	
	// lambda表达式
    int j = calculateNum((a, b) -> {
        return a + b;
    });
    System.out.println(j);
}


public static int calculateNum(IntBinaryOperator operator) {
    int a = 10;
    int b = 20;
    return operator.applyAsInt(a, b);
}

案例3

public static void main(String[] args) {
    // 打印偶数
    
    // 普通方法
    printNum(new IntPredicate() {
        @Override
        public boolean test(int value) {
            return value % 2 == 0;
        }
    });
    
    // lambda表达
    printNum(value -> {
        return value % 2 == 0;
    });
    
    // 再简化
    printNum(value -> value % 2 == );
    
}


public static void printNum(IntPredicate predicate) {
    int[] arr = {1,2,3,4,5,6,7,8,9,10};
    for (int i : arr) {
        if (predicate.test(i)) {
            System.out.println(i);
        }
    }
}

案例4

@FunctionalInterface表示这是个函数式接口,方法apply传入变量参数类型为T,返回参数类型为R。

@FunctionalInterface
public interface Function<T, R> {

    R apply(T t);
	...
}

String类型转为Integer类型

public static void main(String[] args) {
    // 把字符串转换为int类型

    // 普通方法
    Integer num = typeConvert(new Function<String, Integer>() {
        @Override
        public Integer apply(String s) {
            return Integer.parseInt(s);
        }
    });
    System.out.println(num);
    
    // lambda表达式
    Integer num2 = typeConvert(s -> {
        return Integer.parseInt(s);
    });
    System.out.println(num2);
    
    // 再简化
    Integer num3 = typeConvert(Integer::parseInt);
    System.out.println(num3);
    
}


public static <R> R typeConvert(Function<String, R> function) {
    String str = "1235";
    return function.apply(str);
}

案例5

public static void main(String[] args) {

    // 普通方法
    foreachArr(new IntConsumer() {
        @Override
        public void accept(int value) {
            System.out.println(value);
        }
    });

    // 使用lambda表达式
    foreachArr((value) -> {
        System.out.println(value);
    });

    // 再简化
    foreachArr(System.out::println);
}


public static void foreachArr(IntConsumer consumer) {
    int[] arr = {1,2,3,4,5,6,7,8,9};
    for (int i : arr) {
        consumer.accept(i);
    }
}

你可能感兴趣的:(Java,java)