zoukankan      html  css  js  c++  java
  • Java8函数式编程和lambda表达式

    文章目录
    函数式编程
    JDK8接口新特性
    函数接口
    方法引用
    函数式编程
    函数式编程更多时候是一种编程的思维方式,是一种方法论。函数式与命令式编程区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做。简单说,函数式编程是基于某种语法或调用API去进行编程。

    例如,从整型数组中找出最小的那个数字,采用命令式编程实现如下:

    public static void main(String[] args){
    int[] array={1,2,3,4,5,6,7,8,9,10};

    int minx=Integer.MAX_VALUE;
    for(int a:array){
    if(a<minx)
    minx=a;
    }
    System.out.println(minx);
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    而采用函数式编程来实现,则简化为如下代码:

    int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    int minx = IntStream.of(array).min().getAsInt();
    System.out.println(minx);
    1
    2
    3
    4
    我们可以看出,命令式编程需要自己实现具体逻辑,而函数式编程则是调用API完成需要,将命令式的代码写成一系列函数调用,在函数式编程下代码更简洁、易懂,这也就是为什么要使用函数式编程的原因之一。所以才说函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做,这是一种思维的转变。

    而lambda表达式作为函数式编程的基础,也就显得十分重要:

    在Java不支持lambda表达式的时候,我们会去这样创建一个线程:

    new Thread(new Runnable() {
    @Override
    public void run() {
    // TODO Auto-generated method stub
    System.out.println("run()方法");
    }
    }).start();
    1
    2
    3
    4
    5
    6
    7
    而采用lambda表达式:

    new Thread(() -> System.out.println("run()")).start();
    1
    lambda表达式一句话即完成线程的创建,它强调了函数的输入输出,而隐藏了内部实现细节,并且可以接收函数作为输入(参数)和输出(返回值).

    在->的左边是输入,右边是输出.上述代码参数为空。

    该lambda表达式的作用就是返回了Runnable接口的实现对象,这调用某个方法获取实例对象类似,只不过是将实现代码直接写进了lambda表达式中.

    JDK8接口新特性
    函数接口,接口只能有一个需要实现的方法,可以使用FunctionalInterface注解进行声明

    @FunctionalInterface
    public interface InterfaceOne {
    int doubleNum(int i);
    }
    1
    2
    3
    4
    使用lambda表达式获取该接口的实现实例的几种写法:

    InterfaceOne num1 = (i) -> i * 2;

    System.out.println(num1.doubleNum(10));
    InterfaceOne num2 = i -> i * 2;

    // 指定参数类型
    InterfaceOne num3 = (int i) -> i * 2;

    InterfaceOne num4 = (int i) -> {
    System.out.println(i);
    return i * 2;
    };
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    接口的默认方法,用于提供默认实现。默认方法和普通实现类的方法一样,可以使用this关键字。

    @FunctionalInterface
    public interface InterfaceOne {
    int doubleNum(int i);
    }

    default int add(int x,int y){
    return x+y;
    }
    1
    2
    3
    4
    5
    6
    7
    8
    之所以说默认方法这个特性比较重要,是因为我们借助这个特性可以在以前所编写的一些接口上提供默认实现,并且不会影响任何的实现类以及既有的代码。例如我们最熟悉的List接口,在JDK1.2以来List接口就没有改动过任何代码,到了1.8之后才使用这个新特性增加了一些默认实现。这是因为如果没有默认方法的特性的话,修改接口代码带来的影响是巨大的,而有了默认方法后,增加默认实现可以不影响任何的代码。

    当接口多重继承时,可能会发生默认方法覆盖的问题,这时要指定使用哪一个接口的默认方法实现。
    -------------

  • 相关阅读:
    Android Studio 解决unspecified on project app resolves to an APK archive which is not supported
    IOS 一句代码搞定启动引导页
    iOS—最全的真机测试教程
    Hue的三大特点、三大功能和架构
    CentOS和Ubuntu系统下安装vsftp(助推大数据部署搭建)
    Starting vsftpd for vsftpd: [FAILED]问题的解决
    大数据搭建各个子项目时配置文件技巧(适合CentOS和Ubuntu系统)(博主推荐)
    CentOS6.5下Cloudera安装搭建部署大数据集群(图文分五大步详解)(博主强烈推荐)
    Hue的全局配置文件hue.ini(图文详解)
    Cloudera Hue是什么?
  • 原文地址:https://www.cnblogs.com/hyhy904/p/10930574.html
Copyright © 2011-2022 走看看