一、java函数式编程概念(java函数的定义和使用方法)

createh53个月前 (01-21)技术教程42

什么是函数式编程, 每个人的理解不尽相同。函数式编程中的函数并非指计算机中的函数,而是指数学中的函数,即自变量的映射。 其核心思想是: 使用不可变值或函数对一个值进行处理, 映射成另一个值。

在Java中,提到函数式编程,最先想到的是Lambda表达式了,切忌把Lambda表达式和函数式编程划等号,Lambda表达式只是符合函数式编程风格的一种匿名函数表现形式。Lambda表达式在Java8中终于被引入了,这让很多以前代码中的匿名写法得以简化。

public static void main(String[] args) {
        // 匿名内部类写法
        new Thread(new Runnable() {
            public void run() {
                System.out.println("匿名函数");
            }
        }).start();

        // Lambda表达式写法
        new Thread(() -> System.out.println("函数式编程")).start();
    }

设计匿名内部类的目的, 就是为了方便 Java 程序员将代码作为数据传递。 不过, 匿名内部类还是不够简便。 为了调用一行重要的逻辑代码, 不得不加上几行冗繁的样板代码。改成Lambda 表达式使代码更加简洁、易读。

Lambda表达式几种常用写法

1、 Lambda 表达式不包含参数, 使用空括号 () 表示没有参数。 该 Lambda 表达式实现了 Runnable 接口, 该接口也只有一个 run 方法, 没有参数, 且返回类型为 void,如下:

// 写法1
Runnable noArguments = () -> System.out.println("Hello World");
new Thread(noArguments).start();

// 写法2
new Thread(() -> System.out.println("Hello World")).start();

2、 Lambda 表达式包含且只包含一个参数, 可省略参数的括号,如下:

List<String> list = Arrays.asList("nodejs", "java", "python", "ruby");
// 写法1
Consumer<String> oneArgument = str -> System.out.println(str);
list.forEach(oneArgument);

// 写法2
list.forEach(str -> System.out.println(str));

3、 Lambda 表达式的主体不仅可以是一个表达式, 而且也可以是一段代码块, 使用大括号{} 将代码块括起来,代码块和普通方法遵循的规则别无二致, 可以用返回或抛出异常来退出。 只有一行代码的 Lambda 表达式也可使用大括号, 用以明确 Lambda表达式从何处开始、 到哪里结束,如下:

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

4、 Lambda 表达式包含多个参数的方法,使用小括号将参数括起来,如下:

// 直接调用写法
BinaryOperator<Integer> add = (x, y) -> x + y;
int result = add.apply(2, 3);

// 作为参数调用写法
Integer[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int result = math(Arrays.asList(numbers), 0, (x, y) -> x + y);

public static <T> T math(List<T> list, T init, BinaryOperator<T> operator) {
    T result = init;
    for (T t : list) {
        result = operator.apply(result, t);
    }
    return result;
}

5、 Lambda 表达式中的参数类型可以由编译器推断得出的,但也可以显式声明参数类型, 此时就需要使用小括号将参数括起来, 参数类型写在参数前面,如下:

BinaryOperator<Long> addExplicit = (Long x, Long y) -> x + y;

相关文章

原来那些:《java基础教程》不是最基础,而是这套解释概念的教程

最近和一个粉丝聊天,才发现我们给资源的时候没有顾忌到零基础的人群对于计算机认识这一块。发现在学习过程中只掌握方法,没有掌握方法的根源到底是什么,抱歉,是我们的错。一个粉丝对我说,学习后才发现,这些很基...

什么是Java?你知道不?(简述什么是java)

什么Java?估计除了学计算机专业的同学,其他人大部分没听过,或者根本不知道有这样好吃的存在。哈哈哈,说笑了,Java不是什么好吃的,它是一门语言,一门计算机编程语言。有人会问了,Java计算机编程语...

如何在 Java 中定义一个内部类?(java用内部类声明对象)

在Java中,内部类是一个定义在另一个类内部的类。内部类可以是静态的或非静态的。下面是如何定义内部类的例子:public class OuterClass { // 非静态内...

阿里巴巴Java开发手册中的DO、DTO、BO、AO、VO、POJO定义

常用文件夹分层:pojo? vo (与前端交互的所有对象,包括接参和返回)? query (查询的筛选条件,前端传参和后端内部传参通用)? entity (数据库表基础对象)? dto(后端内部传输用...

带你认识Java——这一语言(java是什么语言的一个实例)

1、JavaJava是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象...