您的位置:

Java8中的函数式编程

一、什么是函数式编程

函数式编程是一种编程典范,它的主要思想是把计算封装成不可变的函数,并且避免了改变状态和共享状态。函数式编程不仅仅是一种编程语言的特性,更是一种编程范式,其实现方式主要依靠Lambda表达式和闭包,这种方式使得代码可读性更高,代码量更少。

函数式编程的主要特点如下:

  • 函数是一等公民:函数可以作为参数传递到其他函数中,也可以作为函数的返回值。
  • 纯函数:一个函数的输出结果只与输入参数相关,不受外部环境和状态的影响。
  • 没有副作用:函数执行时不会修改任何外部环境和状态,只返回计算结果。
  • 不可变性:函数的参数和返回值都是不可变的,在使用时需要考虑到这一点。
public class FunctionDemo {
    // 传统的方式
    public static int add(int a, int b) {
        return a + b;
    }

    // Lambda表达式
    public static Function<Integer, Function<Integer, Integer>> addLambda = a -> b -> a + b;

    public static void main(String[] args) {
        int result1 = add(1, 2);
        int result2 = addLambda.apply(1).apply(2);

        System.out.println(result1);
        System.out.println(result2);
    }
}

二、Lambda表达式

Lambda表达式是Java8中引入的一种函数式编程的语言特性,它可以用来创建匿名函数,可以传递到其他函数中作为参数,使用Lambda表达式可以让代码更加简洁、紧凑、易读,且可以接受更多的函数式编程思想。

Lambda表达式由三个部分组成:一个参数列表、一个箭头符号和一个函数体。参数列表可以是一个或多个参数,函数体可以是一条语句或一个块,可以包含任意数量的语句。

// Lambda表达式的例子
(value) -> System.out.println(value)

// 转换成匿名类的例子
new Consumer<Integer>() {
    @Override
    public void accept(Integer value) {
        System.out.println(value);
    }
}

Lambda表达式有以下几种常见的形式:

  • 不带参数: () -> System.out.println("Hello world!")
  • 带一个参数: (str) -> System.out.println(str)
  • 带多个参数: (a, b) -> { int sum = a + b; System.out.println(sum); }
  • 带返回值: (a, b) -> a + b
  • 带参数类型: (int a, int b) -> a + b

三、方法引用

方法引用是一种更加简洁的Lambda表达式的语法形式,它是Lambda表达式的一种语法糖。方法引用可以直接引用已有的方法或构造函数而无需创建新的Lambda表达式,可以使代码更加简洁、易读。

Java8中的方法引用有四种常用的形式:

  • 对象的实例方法: obj::method
  • 类的静态方法: ClassName::method
  • 类的任意对象方法: ClassName::instanceMethod
  • 构造函数: ClassName::new
// 方法引用的例子
stream.map(String::toUpperCase)

// 转换成Lambda表达式的例子
stream.map(str -> str.toUpperCase())

四、Stream API

Stream API是Java8中另一个非常重要的函数式编程的特性,它可以用来处理集合对象,进行过滤、映射、排序等操作,使得代码更加简洁、功能更加强大。

Stream API是基于函数式编程的理念设计的,它主要包括如下几个方面的特性:

  • 惰性求值: 在流的末端操作之前,中间操作不会立即计算,只有在需要结果的时候才会计算。
  • 可链式调用: 流的中间操作可以进行链式调用,方便组合各种操作。
  • 函数表达式参数化: 流的操作方法接收的参数是函数式表达式,允许重写自定义的行为。
  • 并行与顺序: 流中的操作可以采用并行或顺序,提高效率。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);

// 过滤,只保留偶数
List<Integer> result1 = list.stream().filter(i -> i % 2 == 0).collect(Collectors.toList());

// 映射,将每个元素转换成2倍
List<Integer> result2 = list.stream().map(i -> i * 2).collect(Collectors.toList());

// 排序
List<Integer> result3 = list.stream().sorted((a, b) -> b - a).collect(Collectors.toList());

System.out.println(result1);
System.out.println(result2);
System.out.println(result3);

五、Optional类型

Optional类型是Java8中引入的一种新的类型,它主要用来解决空指针异常的问题。Optional类型的主要思想是将可能为空的对象包装成Optional对象,可避免空指针异常。

Optional类型的常用方法如下:

  • of: 将一个非null的值包装到Optional对象中。
  • empty: 创建一个空的Optional对象。
  • ofNullable: 将一个可以为null的值包装到Optional对象中。
  • isPresent: 判断Optional对象是否存在非null的值。
  • orElse: 如果Optional对象持有非null的值,则返回该值,否则返回orElse方法中的参数。
  • orElseGet: 如果Optional对象持有非null的值,则返回该值,否则调用orElseGet方法中的Supplier函数式接口。
Optional<String> optional1 = Optional.of("Hello");
Optional<String> optional2 = Optional.empty();

// get方法获取值
System.out.println(optional1.get());

// orElse方法获取值
System.out.println(optional1.orElse("world"));
System.out.println(optional2.orElse("world"));

// orElseGet方法获取值
System.out.println(optional1.orElseGet(() -> "world"));
System.out.println(optional2.orElseGet(() -> "world"));

六、总结

Java8中的函数式编程提供了一种新的方式来编写Java程序,它使得代码更加简洁、易读,功能更加强大,同时也帮助我们避免了很多错误和陷阱。函数式编程是一种新的编程范式,它的思想已经被越来越多的编程语言所采纳,它将会是未来编程的一个趋势。

Java8函数式编程

2023-05-11
Java8中的函数式编程

2023-05-11
Java8函数式编程

2023-05-18
Java8 Reduce:函数式编程的重要应用

2023-05-20
Java函数式编程用法介绍

Java函数编程是指使用函数作为参数,或使用函数作为返回值的编程方法。一、Lambda表达式Java8引入了Lambda表达式,可以使用函数作为方法参数或返回值。Lambda表达式也可视为匿名函数。(

2023-12-08
Java函数式编程用法介绍

Java函数编程是指使用函数作为参数,或使用函数作为返回值的编程方法。一、Lambda表达式Java8引入了Lambda表达式,可以使用函数作为方法参数或返回值。Lambda表达式也可视为匿名函数。(

2023-12-08
发篇java复习笔记(java课程笔记)

2022-11-09
包含java8安装的词条

2022-11-29
java笔记,尚硅谷java笔记

2022-12-01
印象笔记记录java学习(Java成长笔记)

2022-11-12
java笔记,大学java笔记

2022-11-28
java学习笔记(java初学笔记)

2022-11-14
Java8 Lambda表达式

2023-05-11
htmljs编程笔记(html代码笔记)

本文目录一览: 1、html代码和JS代码有什么区别 2、如何在html中调用js函数 3、JavaScript学习笔记之数组基本操作示例 4、HTML5初学者笔记 5、《web前端笔记7》js字符—

2023-12-08
java基础第一天学习笔记(java课程笔记)

2022-11-09
关于你不知道的java笔记8的信息

2022-11-10
java客户端学习笔记(java开发笔记)

2022-11-14
重学java笔记,java笔记总结

2022-11-23
java基础知识学习笔记一,Java基础笔记

2022-11-21
python的用法笔记本(笔记本学python)

2022-11-16