lambda表达式的分析及使用

Lambda表达式的汇编实现分析及编程示例 在这个示例中,我们定义了一个Lambda表达式,它接受一个整数参数x,并返回factor与x的乘积。Lambda表达式中捕获了外部变量factor。在主函数中,我们创建了一个Lambda函数对象lambda,并将factor的值捕获到闭包对象中。在汇编实现中,编译器会将Lambda表达式转换为可执行的函数对象,并生成相应的汇编代码来处理捕获变量和执行函数体。在本文中,我们将探讨Lambda表达式的汇编实现,并提供一个简单的编程示例。为了更好地理解Lambda表达式的汇编实现,我们提供一个简单的编程示例。 阅读详情

上一篇文章:java通过行为参数化传递代码
上一篇文章讲述了什么叫做行为参数化,也描述了如何从一个变量最终抽象演化到了lambda表达式,这是一个循序渐进的过程,是通过一层一层的抽象实现的。所以延续上篇,本篇来特别详细的讲述一下lambda表达式的使用。

lambda表达式的组成

lambda表达式由三部分组成,分别是:
参数列表:参数列表里面放的是要进行操作的参数,和方法里面的参数是一样的。
箭头:就是这个:-> 它表示需要拿到参数列表里面的参数,然后进行后面的操作。
lambda主体:它是一个表达式,表示参数列表里面的参数在这里进行了什么操作,返回了什么内容。
小小的总结一下,其实它就是一个方法,有参数,有返回值。下面看几个例子,来熟悉一下lambda表达式
第一个例子我来展示全面的代码,顺便在复习一下上篇文章的内容-----什么叫做行为参数化

//创建一个函数式接口
public interface StringTestService {
    public int test(String s);
}

//写一个方法来打印字符串的长度(省略class)
 public static void printLength(StringTestService stringTestService){
        String s = "123";
        System.out.println(stringTestService.test(s));
    }
//main方法中通过lambda表达式来调用上面的方法(省略class)
 public static void main(String[] args) {
         printLength((String s)->s.length());
 }

在这里插入图片描述

上面就是行为参数化的写法啦(将代码作为参数进行传入),打印结果为3。其中下面lambda表达式的解释:

(String s)->s.length()

表示String类型的参数,返回一个int类型的值,没有return语句,因为lambda隐含了return,如果想要return,需要加上花括号{}。(改为 {return s.length();} 参考第三个例子)
第二个例子:

(Apple a)->a.getWeight()>50

该表达式参数为Apple类型,返回一个Boolean值(重量大于50的)
第三个例子:

(String s)->{return "hahaha";}

这是显示返回的写法,会加上花括号和return。
第四个例子:

()->{"hahhahha"}

这是没有参数,且返回值是String类型的lambda表达式。可以显示的写成下面的形式:

()->{return "hahhahha";}

lambda表达式实战

上面介绍了lambda表达式的组成,接下来说一下在什么场景下会使用lambda表达式------函数式接口
函数式接口就是只有一个抽象方法的接口,下面我们来看一下java中常见的函数式接口都有哪些:
Predicate
Predicate接口是java.util包下面的,里面有一个抽象方法test()参数为泛型,返回值为布尔值,我们可以用它来做一个集合中去除空字符串的方法,代码如下:

@FunctionalInterface
public interface Predicate<T> {
    boolean test(T t);
    }

public class PredicateOperation {
    public static <T> List<T> filter(List<T> list, Predicate<T> predicate){
        List<T> result = new ArrayList<>();
       list.forEach(item->{
           if (predicate.test(item)){
               result.add(item);
           }
       });
       return result;
    }

    public static void main(String[] args) {
        System.out.println(filter(Arrays.asList("", "123", "456"), (String s) -> !s.isEmpty()));
    }
}
    

Consumer
java.util下的Consumer接口定义了一个抽象方法accept(),它接收参数是泛型T,但是没有返回值,是void方法。如果我们想访问某对象,并对其进行操作,可以采用该接口。比如可以用它来创建一个foreach方法,接收一个Integer类型的集合,并对其中的每个元素进行操作,代码如下:

@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);
 }
public class ConsumerOperation {

    public static <T> void printContent(List<T> list, Consumer<T> consumer) {
        list.forEach(item->{
            consumer.accept(item);
        });
    }

    public static void main(String[] args) {
        printContent(Arrays.asList(1,3,4), (Integer i)-> System.out.println(
                i
        ));
    }
}

Function
java.util包下的Function接口定义了一个叫做apply的方法,它接收一个泛型T的对象,返回一个泛型R的对象,如果我们需要定一个lambda,将输入对象的信息映射到输出,可以使用该接口。比如我们可以做一个map方法,来打印每一个字符串的长度,代码如下:

@FunctionalInterface
public interface Function<T, R> {
    R apply(T t);
 }


public class FunctionOperation {
    public static <T, R> List<R> map(List<T> stringList, Function<T, R> function) {
        List<R> result = new ArrayList<>();
        stringList.forEach(item -> {
            result.add(function.apply(item));
        });
        return result;
    }

    public static void main(String[] args) {
        System.out.println(map(Arrays.asList("123", "11111", "hehehe"), (String s) -> s.length()));
    }
}

lambda与局部变量

上面的lambda表达式都是使用的参数列表里面的参数,它还可以使用外层作用域中的变量,比如下面的代码就可以捕获参数列表外的参数port进行打印:

public static void main(String[] args) {
        int port=123123;
        Thread thread = new Thread(()-> System.out.println(port));
        thread.start();
    }
}

但是需要注意的是:lambda表达式只能捕获局部变量一次,也就是该局部变量必须声明为final,或者事实上为final(只赋予一次值),这是因为局部变量是存储在栈中的,而lambda是单独的一个线程,当lambda访问局部变量时,如果该局部变量所在的方法执行结束了,就释放栈帧,而这时,lambda所在线程就无法访问该局部变量,因为这根本是两个线程。所以使用final来修饰的时候,lambda实际访问的是该变量的副本。如下图,我再对port变量进行赋值的话,就会报错:
在这里插入图片描述

方法引用

如果一个lambda表达式是直接调用某个方法,那可以直接显示的指明该方法的名字,这样可以让我们的代码可读性更好。写法是:目标引用放在分隔符::前面,方法的名称放在后面。比如:

Apple::getWeight 

上面代码的含义就是引用了Apple类中定义的方法getWeight,它也可以写成下面的形式,只是上面引用的方式看起来更加的简单明了:

(Appple a)->a.getWeight()

方法引用可以作用于静态方法和实例方法,下面我们敲一个demo来实战一下。
现在想要写一个方法来对集合里面的数字进行排序,在不使用stream流的情况下,可以用集合自带的sort方法,sort方法里面的参数是一个Comparator接口,该接口为函数式接口,里面有一个抽象方法compare,参数为两个同类型的泛型,返回值为int,我们可以初步来这样实现:

//sort方法源码如下:
    default void sort(Comparator<? super E> c) {
        Object[] a = this.toArray();
        Arrays.sort(a, (Comparator) c);
        ListIterator<E> i = this.listIterator();
        for (Object e : a) {
            i.next();
            i.set((E) e);
        }
    }
 //Comparator接口如下:
 @FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
}

//我们的第一种写法:
 public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 5, 2, 7);
        list.sort((Integer a, Integer b) -> a.compareTo(b));
    }

学习了方法引用之后,可以变成下面的方法,直接调用Integer的compareTo方法:

public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 5, 2, 7);

        list.sort(Integer::compareTo);
    }

有人好奇他的参数类型在哪里判断的呢,这个java会根据上下文自动判断其参数类型,可以写也可以不写,比如第一种写法写成下面这样的也是没问题的:

   public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 5, 2, 7);

        list.sort( (a,b) -> a.compareTo(b));
    }

总结:本篇文章主要讲了lambda表达式的组成、使用方法、简化,也涉及到一些常见的java自带的函数式接口,我们可以在工作中尝试着来使用。其实我们对集合的操作大部分还是使用stream流,后面我会继续写有关stream流的文章,欢迎大家斧正。
参考资料----《java8实战》

高精度SAR ADC设计实战:从建模到版图的16位1MSPS实现 本文详细介绍了16位1MSPS高精度SAR ADC的设计过程,从建模到版图实现的完整流程。重点探讨了分段电容阵列设计、校准算法实现及版图匹配等关键技术,展示了如何在180nm工艺下实现92.5dB SNDR和109.6dB SFDR的高性能指标。文章特别强调了整数桥接电容设计对提升匹配精度的关键作用,为高精度模数转换器设计提供了实用参考。 阅读详情

相关推荐

【2026-Spark实验一-Windows中安装Spark环境】

本文详细介绍了在Windows系统中配置Spark 3.5.8开发环境的完整流程。主要内容包括:安装JDK 8并配置环境变量,下载并解压Spark 3.5.8预编译版,设置SPARK_HOME系统变量,配置Hadoop的winutils工具解决Windows兼容性问题。通过spark-shell和SparkPi示例程序验证环境配置成功,确保Spark能够正常运行分布式计算任务。文中特别强调了路径命名规范、环境变量设置顺序等关键细节,提供了完整的配置截图和验证方法,帮助开发者快速搭建稳定的Spark学习环境。

pblh123的专栏 1586

【无标题】Lambda表达式详解

前言 1、天真热,程序员活着不易,星期天,也要顶着火辣辣的太阳,总结这些东西。 2、夸夸lambda吧:简化了匿名委托的使用,让你让代码更加简洁,优雅。据说它是微软自c#1.0后新增的最重要的功能之一。 lambda简介 lambda运算符:所有的lambda表达式都是用新的lambda运算符 " => ",可以叫他,“转到”或者 “成为”。运算符将表达式分为两部分,左边指定输入参数,右边是lambda的主体。 lambda表达式: ...

北京谢吉华的专栏 801

影刀RPA:轻松搞定Excel表格自动化操作

影刀RPA是一款功能强大的自动化工具,通过模拟人类操作实现各种重复性任务的自动化。零代码操作:通过拖拽式流程设计器,无需编程基础即可快速上手。功能丰富:提供丰富的组件库,涵盖文件操作、数据处理等多种功能。高效稳定:支持多任务并行,确保任务的高效执行和稳定性。支持Python语法:内置数据表格,支持Python语法,对新手友好,同时具备循环功能。通过影刀RPA,您可以轻松实现Excel表格的拆分、列数据合并和归档工作的自动化。这不仅节省了手动操作的时间,还能确保数据处理的高效和准确,提升工作效率和管理水平。

watwrmoon的博客 2560

认识VUE 3.0

TypeScript 优势在于: 1.对数据类型增加了约束,例如:username:string 代表username 这个变量只能被赋予string类型的参数。 2.拓展 class 和 interface 的类型。 3.lambda 表达式:()=>{something}或者是()=>someting 相当于 js 中的函数,该函数写法 可以自动将 this 附加到上下文中。 技术总是在更新迭代,vue2 版本有许多明显痛点,源码自身的维护性,数据量大渲染和更新的性能问题,一些想舍弃

Geralt_of_theone的博客 388

机器学习 线性回归 头歌实训

第1关:简单线性回归与多元线性回归 第2关:线性回归的正规方程解 第3关:衡量线性回归的性能指标 第4关:scikit-learn线性回归实践 - 波斯顿房价预测

weixin_57270536的博客 1万+

nRF52382低功耗蓝牙应用开发之入门教程-软件烧录

准备工作在上一篇文章讲过了,这里就讲讲nRFgo studio的使用 硬件准备: J-link:2线 供电:3.3V 如下图打开nRFgo studio界面介绍, 2、如果J-link正常,如下图 3、如果蓝牙芯片正常 4、烧录过程,如果蓝牙芯片之前有烧录过程序,需先点擦除,再点烧录 5、烧录代码路劲,例如 F:\nRF\SDK\nRF5_SDK_15.2.0_...

LinQiPing233的博客 1945

lambda表达式

()-> 1返回整数 () -> {} 返回空; //参数类型可以省略,使用lombda表达式时,可以实现只有一个方法的接口或匿名类, lambda表达式是jdk1.8才支持的

qq_44443306的博客 202

用python画带有正负值的条形图

常见的条形图只能表现数据的大小,却不能表现值的正负关系。但是其实仅仅使用`pandas`和`matplotlib`两个包就可以实现y轴负轴的添加以及负值的显示,并且可以为正负值分别设置不同的颜色,让条形图看上去更加清晰,易于我们分析

weixin_44853840的博客 5383

【第一个Vue上手小项目Day5】单独封装Echarts图表,后端Lambda进行数据筛选

一、折线图+饼图 前端效果: 二、Vue引入Echarts 项目路径下安装echarts(原版百度图表库)和vue-echarts(比较轻量) cnpm install echarts vue-echarts src目录下新建:echarts包,在里面新建index.js和目录myEcharts(myEcharts.js) index.js是echarts配置,待会儿会注入到main...

cungudafa的博客 1384

使用Simulink进行无刷电机霍尔传感器信号处理电路的仿真

位置检测:霍尔传感器可以检测转子的位置,这对于实现无刷电机的电子换向至关重要。提高效率:通过准确的位置信息,可以优化电机的工作状态,提高效率和性能。通过上述步骤,我们简要介绍了如何基于Simulink实现无刷电机霍尔传感器信号处理电路的仿真。

MHD0815的博客 431

学习STM32的CAN总线通信

在配置时,确保您启用了CAN总线功能。CAN节点是CAN总线上的一个设备,每个节点都有唯一的标识符。在CAN总线中,有两种类型的节点:CAN控制器和CAN外设。步骤2:配置CAN总线 在STM32CubeMX中,选择CAN总线模块并进行必要的配置。在CAN总线中,有两个重要的概念:CAN节点和CAN帧。步骤5:测试CAN总线通信 在成功编译和烧录代码后,您可以使用串口调试助手或其他CAN总线工具来测试CAN总线通信。步骤3:编写CAN总线通信代码 在项目的主代码文件中,我们将编写CAN总线通信的示例代码。

2401_85258012的博客 496

AWS S3(vue)+API Gateway+lambda实现无服务网站

0 写在前面的话 公司最近转型serverless要把一些内部CMS和部分外部网站放到AWS上,先简单的实现个S3(vue)+API Gateway+lambda的无服务建站的小例子, 感觉一般的网站真心没必要再自己弄EC2了,尤其初创公司,开始公司用户少,这套方案按访问量收费不香吗?lambda每月还有几万的免费访问量,真的很省钱, 还有各种高可用,动态扩容,安全性,都不用考虑了,找个码农直接开干,业务流程跑通了再说。闲话不说下面开干 1.1 S3(Vue)设置 1.1 ...

baidu_31405631的博客 2505

【DaVinci Configurator专题】-5-通过Data Mapping自动创建CAN信号关联的Port并添加到APP SWC

目录 1 导入CAN Matrix变更后的Arxml文件 2 自动创建CAN信号关联的APP Port 3 CAN信号与App SWC的接口映射/连接 4 结尾 <--返回「实战篇」博文-总目录--> <--返回「Autosar从入门到精通-实战篇」专栏主页--> 关键词: DaVinci Developer DaVinci Configurator Pro ARXML AUTOSAR System Description Network Explorer 1

「汽车电子助手」的博客 5129

C++中lambda表达式详解与原理分析

lambda表达式的本质就是重载了()运算符的类,这种类通常被称为functor,即行为像函数的类。因此lambda表达式对象其实就是一个匿名的functor。 C++中lambda表达式的构成 一个标准的lambda表达式包括:捕获列表、参数列表、mutable指示符、尾置返回类型(-&gt;返回类型)和函数体: [capture list] (params list) mutab...

LPWSTR的博客 8764

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

foreach lambda写法_详解lambda表达式foreach性能分析

java 8的新特性之一就是lambda表达式,parallelStream()都说性能会比较高,现一探究竟。话不多说,上代码:@Testpublic void test2(){List list = new ArrayList<>();for(int i=0;i<10000;i++)list.add(String.valueOf(i));//lambda表达式long star...

weixin_29230773的博客 5526

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Lambda 表达式实现原理分析

本文从实现原理的角度解析了C++中Lambda表达式的内部机制。Lambda表达式本质上是编译器生成的匿名类(closure class),该类重载了operator()方法以实现表达式的调用。同时,编译器会创建一个匿名结构体来捕获环境变量,并将其存储为结构体的成员变量。

kongranlou4810的博客 765

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Lambda表达式实现机制的分析

1. 背景 几年前曾经写过一篇Lambda表达式实现机制的分析,现在回头看错误很多,有误导嫌疑,因此重写一版订正。 2. Lambda表达式的字节码分析 下面代码为一个Lambda表达式的例子 package demo; import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; public class Test1 { public void func1(List<Inte

860MHz的专栏 513

【数据分析-27】向量化和lambda表达式

向量化:向量化是一种优化手段,能够对整个数组或 DataFrame 执行批量操作,避免了逐个元素的显式循环,极大地提高了执行效率。lambda表达式:适用于定义简单的匿名函数,通常与map()filter()和apply()等高阶函数一起使用,可以实现对数据的灵活处理。向量化适用于能够通过批量操作完成的任务,性能更好。lambda表达式适用于需要自定义复杂操作的场景,灵活但可能在大数据量时较慢。

m0_69378371的博客 656

现代Java中Lambda表达式和方法引用的系统性分析

编译器知道Comparator的compare方法有两个String参数,它会将第一个参数s1作为调用compareToIgnoreCase方法的对象,第二个参数s2作为该方法的参数。当一个Lambda表达式的主体仅仅是调用一个已经存在的方法,并且不进行任何其他操作时,就可以使用方法引用来代替,以达到极致的简洁和清晰。1.静态方法引用:当Lambda表达式的实现恰好是调用一个静态方法,并且Lambda的参数与该静态方法的参数列表完全匹配时,可以使用静态方法引用。:当抽象方法只有一个参数时,括号是可选的。

xjd444的博客 1362

18.Java Lambda 表达式(Lambda 表达式练习与原理分析、@FunctionalInterface 注解)

18.Java Lambda 表达式(Lambda 表达式练习与原理分析、@FunctionalInterface 注解)

weixin_52173250的博客 792

Lambda 表达式介绍和底层实现分析

如果你的需求需要匿名类来实现,例如是一个只有一个方法的接口,那么匿名类的语法可能看起来比较笨拙和不清晰,尽管匿名类比命名类更简洁,但对于只有一个方法的类来说,即使是匿名类也显得有些麻烦。还有在一些情况下,需要将功能作为参数传递给另一个方法,例如当有人单击页面上按钮时应该采取什么操作,javascript 可以通过闭包实现。在 java 语言中,lambda 表达式能够将功能视为方法参数,或将代码视为数据,而且 lambda 表达式可以更紧凑地表达单方法类的实例,在 Swing 编程和集合(Collectio

weixin_43507410的博客 436

Java Lambda表达式 实现原理分析

本文分析基于JDK 9 一、目标 本文主要解决两个问题: 1、函数式接口 到底是什么? 2、Lambda表达式是怎么实现的? 先介绍一个jdk的bin目录下的一个字节码查看工具及反编译工具:javap 二、函数式接口 @FunctionalInterface interface IFunctionTest&lt;T&gt; { public void prin...

勿忘初心 2万+

【Kotlin】Kotlin 中使用 Lambda 表达式替代对象表达式原理分析 ( 尾随 Lambda - Trailing Lambda 语法 | 接口对象表达式 = 接口#函数类型对象 )

一、尾随 Lambda - Trailing Lambda 语法 二、Kotlin 中使用 Lambda 表达式替代对象表达式原理 1、Lambda 替换对象表达式 2、原理分析 3、示例分析

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1946

Lambda表达式介绍和底层实现分析

所以使用lambda表达式的地方,会在类编译的时候在本类中生成对应的私有静态方法和一个INNERCLASS的访问标识(具体是什么东西没找到资料,注释显示是一个访问标识),该访问标识会调用引导类加载器动态生成内部类,该内部类实现了函数式接口,在实现接口的方法中,会调用编译器生成静态方法,在使用lambda表达式的地方,通过传递内部类实例,来调用函数式接口方法。函数式接口本身就是一个普通的接口,而lambda表达式本质上和匿名内部类是一样的,只不过条件更加苛刻。

ceshiren456的博客 288

Java Lambda 表达式源码分析

Lambda 表达式在 Java 中最终编译成私有的静态函数,JDK 最终使用 invokedynamic 字节码指令调用。

m0_64363449的博客 191

Lambda表达式与匿名内部类的区别分析

一、 匿名内部类 匿名内部类其实就是没有名字的内部类,但是其必须要实现一个接口或者继承一个父类,通常是用来简化代码 例程如下: 先定义一个 IAnimal public interface IAnimal {     void run();     void walk(); } 然后定义测试类 NestedClassTest public class NestedClassTest...

johnt25的博客 2981
上一篇: java中通过行为参数化传递代码
下一篇: java8新特性----Stream流使用
玉带林中挂
博客等级 码龄8年 264粉丝 167原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值