Lambda01 编程范式、lambda表达式与匿名内部类、lambda表达式的写法

1 编程范式

  主要的编程范式有三种:命令式编程,声明式编程和函数式编程。

  1.1 命令式编程

    关注计算机执行的步骤,就是告诉计算机先做什么后做什么

  1.2 声明式编程

    表达程序的执行逻辑,就是告诉计算机要做什么,不指定具体怎么做

  1.3 函数式编程

    跟声明式编程类似,就是告诉计算机做什么,不指定具体怎么做

  参考博文

  1.4 demo实例

    1.4.1 需求

      随机产生一个int类型的数组,分别利用命令式编程和函数值编程获取数组中的最小值

    1.4.2 思路

      命令式编程:

        随记产生int类型数组 -> 定义一个int类型变量minNumber并取int的最大值 -> 利用循环遍历数组 -> 将数组中的每个元素和minNumber进行比较,如果比minNumber小就复制给minNumber,否则就进行下一次循环

      函数值编程:

        随记产生int类型数组 -> 定义一个int类型的变量minNumber并取int的最大值 -> 将数组转化成流 -> 调用的流的相关方法获取流中的最小值 -> 将获取到的最小值进行类型转化后在复制给minNumber

    1.4.3 代码实现

package a_test_demo;

import org.junit.Before;
import org.junit.Test;

import java.util.Arrays;
import java.util.Random;
import java.util.stream.IntStream;

/**
 * @author 王杨帅
 * @create 2018-06-24 17:14
 * @desc
 **/
public class Case02 {

    /**
     * 需求:随机产生一个int类型的数组并通过命令式编程和函数式编程分别求出数组中的最小值
     */

    private int[] nums; // 定义一个int类型的数组
    int count = 10; // 数组长度
    Random random; // 随机数对象

    @Before
    public void init() {
        random = new Random(); // 实例化Random
        nums = new int[count]; // 实例化数组
        for (int i = 0; i < nums.length; i++) { // 修改数组内容
            nums[i] = random.nextInt(30);
        }
//        System.out.println(Arrays.toString(nums)); // 打印数组信息【测试用】
    }

    /**
     * 利用命令式编程实现
     */
    @Test
    public void test01() {
        int minNumber = Integer.MAX_VALUE; // 存储最小值【初始化时时最大值】

        for (int i = 0; i < nums.length; i++) {
            if (minNumber > nums[i]) {
                minNumber = nums[i];
            }
        }

        System.out.println(Arrays.toString(nums) + " 中的最小值为: " + minNumber);
    }

    /**
     * 利用函数式编程实现
     */
    @Test
    public void test02() {
        int minNumber = Integer.MAX_VALUE;

        minNumber = IntStream
                        .of(nums) // 将数组转化成流
                        .parallel() // 设置并行处理【PS: 如果是命令式编程需要自己实现相应逻辑】
                        .min() // 获取流中的最小值
                        .getAsInt(); // 将值转化成int类型

        System.out.println(Arrays.toString(nums) + " 中的最小值为: " + minNumber);
    }

}

2 lambda表达式与匿名内部类

  2.1 需求

    现有一个名为getName的方法,该方法的参数是一个Student接口;怎么调用getName方法

  2.2 思路

    2.2.1 思路一

      创建一个名为StudentImpl的类,该类实现了Student接口 -> 调用getName方法时传入StudentImpl的实例即可

    2.2.2 思路二

      利用匿名内部类作为getName方法的实参

    2.2.3 思路三

      利用lambda表达式作为getName方法的实参

  2.3 代码实现

package a_test_demo;

import org.junit.Test;

public class Case01 {

    /**
     * getName方法:用户打印学生的姓名
     * @param student Student接口
     */
    public void getName(Student student) {
        System.out.println("学生的姓名为:" + student.name());
    }

    /**
     * 利用实现类实现
     */
    @Test
    public void test01() {
        Student student = new StudentImpl();
        getName(student);
    }

    /**
     * 利用匿名内部类实现
     */
    @Test
    public void test02() {
        getName(new Student() {
            @Override
            public String name() {
                return "fury";
            }
        });
    }

    /**
     * 利用lambda表达式实现
     */
    @Test
    public void test03() {
        getName(() -> "zeus");
    }

}

/**
 * Student接口
 */
interface Student {
    /**
     * 抽象方法:返回String类型的姓名
     * @return
     */
    String name();
}

/**
 * Student接口的实现类
 */
class StudentImpl implements Student {

    @Override
    public String name() {
        return "warrior";
    }
}

  2.4 三种方法使用场景

    2.4.1 实现类

      当某个类需要实例化多次时使用

    2.4.2 匿名内部类

      某个类只需要实例化一次而且不需要知道实例名称时使用【通常这个类需要进行重写的方法不止一个】;如果需要知道实例名称时就需要使用内部类

    2.4.3 lambda表达式

      某个类需要实例化一次而且不需要知道实例名字【这个类中通常有且只有一个需要重写的方法】

  2.5 为什么Lambda表达式可以作为方法的参数呢

    Lambda 可以作为方法的参数。Lambda 表达式是函数式接口实现类的实例,所以,Lambda 表达式作为方法的参数,实际就是把一个类实例作为方法的参数。Lambda 表达式表达或是设计了一组功能,把它传递给方法作为参数,实际上,可以理解为把一组功能传递给了方法。因此,为了让代码更加简洁,编程更加高效,调用方法(该方法的参数类型是接口类型)时,若接口有多个抽象方法,我们可以创建这个接口的匿名实现类的实例,作为方法的参数。若是接口只有唯一一个抽象方法,比如函数式接口,我们可以创建这个接口的 Lambda 表达式,作为调用方法的参数,把一组功能传递给方法。

    技巧01:lambda表达式 “->” 左边相当于函数式接口中那个方法的形参,“->” 的右边相当于函数式接口中那个方法的返回值

       

    技巧02:函数式接口就是只有一个抽象方法的接口

3 lambda表达式的写法

      

原文地址:https://www.cnblogs.com/NeverCtrl-C/p/9221300.html

时间: 2024-08-21 23:00:41

Lambda01 编程范式、lambda表达式与匿名内部类、lambda表达式的写法的相关文章

一个将lambda字符串转化为lambda表达式的公共类

一个将lambda字符串转化为lambda表达式的公共类.StringToLambda 使用方式如下: var module = new Module(); url = url.ToLower();//转换为小写 Expression<Func<Module, bool>> exp = StringToLambda.LambdaParser.Parse<Func<Module, bool>>("p=>p.Url.ToLower().Conta

c++ 11学习笔记--Lambda 表达式(对比测试Lambda ,bind,Function Object)

所有c++ coder都应该为这个语法感到高兴,说的直白一点,Lambda 表达式就是函数对象的语法糖. 还是直接看对比栗子吧,抄袭的是msdn的官网 该示例使用 for_each 函数调用中嵌入的 lambda 向控制台打印 vector 对象中的每个元素是偶数还是奇数. 使用lambda #include <algorithm> #include <iostream> #include <vector> using namespace std; int main()

.net 系列:Expression表达式树、lambda、匿名委托 的使用【转】

https://www.cnblogs.com/nicholashjh/p/7928205.html 首先定义一个泛型委托类型,如下: public delegate T Function<T>(T a, T b); 实现泛型委托的主体代码,并调用: 1 public static string Add(string a, string b) 2 { 3 return string.Format("{0} #### {1}",a,b); 4 } 5 //实名委托方式 6 F

Qt5中的lambda表达式和使用lambda来写connect

c11新特性中加入了lambda表达式,所以Qt 也支持 需在.pro文件中加入 CONFIG += c++11 例子: QString program = "C:/Windows/System32/cmd.exe"; QStringList arguments; arguments << "/c" << "dir" << "C:\\"; QProcess* cmdProcess = new

五分钟重温C#委托,匿名方法,Lambda,泛型委托,表达式树

五分钟重温C#委托,匿名方法,Lambda,泛型委托,表达式树 https://masuit.com/81 曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托,表达式树这些应用.今天我尝试用简单的方法叙述一下,让大家在五分钟内看完这篇博客 第一分钟:委托 有些教材,博客说到委托都会提到事件,虽然事件是委托的一个实例,但是为了理解起来更简单,今天只谈委托不谈事件.先上一段代码: 下边的代码,完成了一个委托应用的演示.一个委托分三个步骤: 1 2 3 4 5 6 7 8 9 10 11 12

08_Lambda表达式与匿名内部类的联系与区别

[简述] Lambda表达式是匿名内部类的一种简化,因此它可以取代匿名内部类的作用. [Lambda表达式与匿名内部类的 相同点] 1.Lambda表达式和匿名内部类一样,都可以直接访问"effectively final"的局部变量,以及外部类的成员变量(包括实力变量和类变量) 2.Lambda表达式创建的对象和匿名内部类创建的对象一样,都可以直接调用从接口中继承的默认方法. [相同点的实例] package com.Higgn.Lambda; @FunctionalInterfac

深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

最近看了一下java 8的一些新特性,其中最重要的莫过于Lambda表达式了,通过一阵子的学习,原本准备自己写一篇博客的,后来阅读了一位学长翻译过来的博客(原文是Brain Goetz的State of Lambda,下面会给出原文链接),觉得写的十分完美,把我想要写的和我没想到的都罗列了出来,就把这个分享给大家了. 注:原译文见  http://lucida.me/blog/java-8-lambdas-insideout-language-features/ 英语原版见:http://cr.

[转]深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

以下内容转自: 作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language-features 本文谢绝转载,如需转载需征得作者本人同意,谢谢. -------------------------------------内容分割线--------------------------------------------------------- 关于 本文是深入

函数式编程(一) 认识“编程范式”和“函数”

编程范式(Programming paradigm) 编程范式指我们在编写程序解决问题的思路和视角.它提供了同时也决定了程序员对程序运行的看法.计算机编程中存在许多编程范式,如命令式编程.声明式编程.面向对象编程以及结构化编程等等.其中面向对象编程范式认为程序是由一系列相互作用的对象组成,而结构化编程范式认为程序采用子程序.代码区块.for循环以及while循环等结构组成.下面主要说明本篇文章将要讲到的命令式编程范式和声明式编程范式. 1)命令式编程(Imperative): 强调程序代码模拟电