Java基础(4)-Java8函数式编程

jdk1.8 List集合Stream流式处理 Java 8 引入了一个新的抽象层——Stream API,它允许你以声明性方式处理数据集合(包括数组、集合等)。Stream API 提供了一种高效且易于表达的方式来处理数据集合,包括过滤、排序、映射和归约等操作。这种处理方式极大地提高了代码的可读性和可维护性,同时也提升了处理大量数据的性能。Stream(流)是 Java 8 引入的一个关键抽象概念,它代表了一个来自数据源的元素队列并支持聚合操作。 阅读详情


在这里插入图片描述

Java 8发布于2014年,距现在已经有4个年头了,被誉为继Java 5以来最具革命性的版本:新增Lambda表达式、引入流式API(Stream API)使Java具有函数式编程的风格、引入Optional类来防止空指针异常、新增接口的默认方法实现关键字default,让实现类默认拥有这个接口的钩子、新增::方法引用等等,在本文中都将一一介绍。

一、Lambda表达式

1.1、用Lambda表达式代替匿名内部类

Lambda是希腊字母λ的英文,Lambda表达式允许你通过表达式来代替匿名功能接口实现方法的这一系列繁琐的代码,起到精简结构的作用,
Lambda表达式的语法为:

(parameters) -> expression
或
(parameters) ->{ statements; }

以下是使用Runnable接口并且重写run方法的一个例子:

		//创建带缓冲池的Executor
        ExecutorService executorService = Executors.newCachedThreadPool();
        
        //原始写法
        executorService.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println("创建一个Runnable接口并且重写run方法");
            }
        });

        //使用Lambda表达式
        executorService.execute(()-> System.out.println("创建一个Runnable接口并且重写run方法"));

原本我们需要在execute()方法中新建一个Runnable接口并且重写run方法,在使用了Lambda表达式之后,可使用()-> {}代替Runnable接口的重写run方法,达到简化代码的作用。

1.2、Lambda表达式的参数类型判断

并且在Java 8中,Lambda表达式具有参数类型自动判断:

		 //等于return x + y
        (int x,int y)->x + y

        //也可以这样写,自动参数类型判断
        (x,y)->x + y
		
		//--------------------------------------------
			
			// 使用匿名内部类  
		 setOnAction(new EventHandler<ActionEvent>() {  
          @Override  
          public void handle(ActionEvent event) {  
              System.out.println("Hello World!");   
          }  
	    });  
   
		//使用Lambda表达式,自动将event判断为ActionEvent类型  
		btn.setOnAction(event -> System.out.println("HelloWorld!"));  

注意:在使用Lambda表达式去代替匿名接口重写方法时,这个接口有且只有唯一的一个抽象方法,不然Lambda表达式无法判断需要重写哪个方法。

二、Stream API

流式API是Java 8后引入的重要特性之一,它提供了一套完整的API,配合Lambda表达式使用可以简化代码,使Java代码拥有函数式编程的风格。

2.1、Stream API 和 Lambda Expression实现遍历的Demo

现在假设我们需要获取List< String >中首字母为a的数据,可以有以下两种写法,我们可以发现使用流式编程和Lambda表达式后会更加地凝练:
获取流-过滤流-遍历流。

		 String[] arrays = {"a1","a2","b","c"};
        //将arrays转化为List<String>
        List<String> stringList = Arrays.asList(arrays);

        //原始的处理方法
        for (String s : stringList) {
            if(s.charAt(0) == 'a'){
                System.out.println(s);
            }
        }
        
        //Stream API 结合 Lambda Expression
        stringList.stream()
                     .filter(s->s.charAt(0) == 'a')
                     .forEach(s-> System.out.println(s));


2.2、Stream常用方法

Stream是在Java 8之后更新的一种流,它不同于io流中的InputStream、OutputStream等,准确地说,这个位于java.util下的Stream和io中的流毫无关系。这里的Stream是数据流和对象流。

2.2.1、 of(T… values)

要把List、Set转化为数据流可以使用xxxList.stream()或者使用Stream.of(T…values),T…values代表着数组或者是不定数量的数据,它们会按顺序转换成数据流。

  • 获得Stream的三种方式
		//1
        Stream<String> stringStream1 = Stream.of(new String[]{"a","b","c"});
        //2
        Stream<String> stringStream2 = Stream.of("a","b","c");
        //3
        Stream<String> stringStream3 = stringList.stream();
2.2.2、filter(Predicate<? super T> predicate)

filter用以将流按需过滤成新的流,需要传入的参数为一个位于java.util.function下的Predicate接口并重写test方法去进行校验:

Stream newStream = stringList.stream().filter(new Predicate() {
            @Override
            public boolean test(Object s) {
                if (s.toString().charAt(0) == 'a') {
                    return true;
                }
                return false;
            }
        });

利用Lambda表达式,我们可以将上述代码简化为:

Stream newStream = stringList.stream().filter(s->s.charAt(0) == 'a');
2.2.3、 forEach(Consumer<? super T> action)

对此流的每一个元素进行操作,需要传入的参数为Consumer接口并且实现其accept方法:

stringStream.forEach(new Consumer(){
            @Override
            public void accept(Object s) {
                System.out.println(s);
            }
        });

结合Lambda表达式:

stringStream.forEach(s->System.out.println(s));
2.2.4、map(Function<? super T,? extends R> mapper)

map方法的作用是对Stream进行处理并且返回一个其他对象充当原Stream。

  • 将数据转换为大写
 String[] arrays = {"a1","a2","b","c"};
        //将arrays转化为List<String>
        List<String> stringList = Arrays.asList(arrays);
        List<String> collect = stringList.stream()
                .map(String::toUpperCase)
                .collect(Collectors.toList());
        System.out.println(collect);

需要说明的是,map方法需要传入的参数是一个函数式方法,可以使用lambda表达式也可直接使用双冒号表达式(现在可以将双冒号表达式::理解为对象通过::调用方法并且传入当前的数据作为参数);而collect方法则是将经过map处理的流“收集”起来形成新的流,传递参数Collectors.toList()表示以List的形式转化流。

  • 删除末尾的数字
List<String> collect1 = Stream.of(arrays)
                .filter(v -> v != null)
                .map(v -> {
                    if (v.length() == 2) {
                        //删除尾部
                        v = v.substring(0, v.length()-1);
                    }
                    //返回最终结果
                    return v;
                })
                .collect(Collectors.toList());
        System.out.println(collect1);
  • 将Person对象转化为Student对象
    class Person implements Serializable {
            //编号
            private int id;
            //姓名
            private String name;
            //年龄
            private int age;
            //getter setter...
        }

        class Student implements Serializable {
            //学号
            private int schoolId;
            //姓名
            private String name;
            //年龄
            private int age;
            //getter setter...
        }


        public static void main(String[] args) {
            List<Person> personList = Arrays.asList(new Person(1, "lily", 18)
                , new Person(2, "arong", 19)
                , new Person(3, "joke", 20));
        //将PersonList转化为Studentlist
        List<Student> studentList = personList.stream().map(p -> {
            Student student = new Student();
            student.setSchoolId(3111000 + p.getId());
            student.setName(p.getName());
            student.setAge(p.getAge());
            //将转化好的student作为结果返回
            return student;
        }).collect(Collectors.toList());
        
        System.out.println(studentList.toString());

        }
    }

三、default关键字

在Java 8之前,接口中只能定义方法标签,而无法定义方法体,所有的方法体都由实现类去实现,如果需要在实现类中 使用父类的“钩子函数”,那么则需要使用抽象类去代替接口:

/**
 * @Author: arong
 * @Description: 抽象类Demo
 * @Date: 2018/12/23 13:05
 */
public abstract class AbstractTestClass {
    //钩子方法
    public void hookMethod(){
        System.out.println("抽象类默认实现的钩子方法");
    }

    //需要子类重写的方法
    public abstract void abstractMethod();
}

而在Java 8中引入了default关键字,能够让接口提供钩子方法:

/**
 * @Author: arong
 * @Description: Interface Demo
 * @Date: 2018/12/23 13:09
 */
public interface TestInterface {
    //钩子方法
    default void hookMethod(){
        System.out.println("接口默认实现的钩子方法");
    }

    //需要实现类重写的方法
    void abstractMethod();
}

四、optional类

Java 8 引入的一个很有趣的特性是 Optional 类。Optional 类主要解决的问题是臭名昭著的NPE(NullPointerException)。
以下就是一个经典的例子:

			User user = new User();
            user.setUserName("arong");
            User user1 = new User();
            user1.setUserPassword("arong");
            CopyOnWriteArrayList<User> userList = new CopyOnWriteArrayList<User>();
            ConcurrentHashMap map = new ConcurrentHashMap<String, List<User>>();
            map.put("userList",userList);

            //判断map是否为null
            if (map != null) {
                List userListTemp = (List<User>) map.get("userList");
                //判断userListTemp是否为null且大小大于0
                if (userListTemp != null && userListTemp.size() > 0) {
                    User userTemp = (User) userListTemp.get(0);
                    String userName = userTemp.getUserName();
                    //判断userName是否为null
                    if (userName != null) {
                        System.out.println(userName);
                    } else {
                        System.out.println("null");
                    }
                }

            }
            //使用Optional类可以很好地解决NPE问题
            String userName = Optional.ofNullable(map)
                    .map(n -> (List<User>) n.get("userList"))
                    .filter(n->n.size() > 0)
                    .map(n -> (User) n.get(0))
                    .map(n -> n.getUserName())
                    //.orElseThrow(() -> new RuntimeException("不存在"));
                    .orElse(null);

            System.out.println(userName);
Java8 函数式编程 Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来对 Java 集合运算和表达的高阶抽象。Stream API 可以极大提高 Java 程序员的生产力,让程序员写出高效率、干净、简洁的代码。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 变换,聚合等。 阅读详情

相关推荐

Java 8的函数式编程:利用Java 8的lambda和Stream API,分享Java是如何采纳函数式编程思想的

Java 8新特性介绍 概述Java 8的新特性,如Lambda表达式、Stream API、函数式接口和默认方法 Lambda表达式 解释什么是Lambda表达式 介绍如何在Java中编写和使用Lambda表达式 举例(如使用lambda改写匿名内部类) 解析Lambda表达式的类型推断 展示使用Lambda表达式可带来的代码简化 函数式接口 介绍函数式接口的概念 介绍常用的函数式接口如Predicate, Function, Consumer, Supplier 阐述使用Lambda表达式实现函数式接口

哎 你看的博客 1196

【转】Java8 函数式编程详解

1.Java函数式编程的语法: 使用Consumer作为示例,它是一个函数式接口,包含一个抽象方法accept,这个方法只有输入而无输出也就是说这个方法无返回值。 现在我们要定义一个Consumer接口的实例化对象,传统的方式是这样定义的: public static void main(String[] args) { //JDK1.8版本之前的做法 Consumer<Integer> con = new Consumer<Integer>() { @Override

魂-淡 2589

java1.8流式用法-工作使用总结经验

工作中经常需要用到流的用法,通过使用流让程序的阅读性更强,代码更简洁。

ZhiguoXue_IT的博客 346

Java的<? super T>和<? extends R>理解与应用

记录:293 场景:Java的 ? super T 和? extends R 理解与应用。? super T:表示?匹配的类型都是T的父类,包括T本身。? extends R:表示?匹配的类型都是类型R的子类,包括R本身。

zhangbeizhen18的博客 5842

Chkdsk误删文件?5步教你从FOUND.000文件夹找回重要数据(附工具推荐)

本文详细介绍了当Chkdsk误删文件后,如何从FOUND.000文件夹中找回重要数据的5个步骤。包括理解Chkdsk与FOUND.000的关系、定位与访问FOUND.000文件夹、手动恢复CHK文件的技巧、使用UnCHK工具自动化恢复以及预防数据丢失的关键措施。适用于Windows用户解决数据丢失问题,特别是NTFS文件系统下的文件恢复。

weixin_30687051的博客 392

Simulink与C/C++的无缝对接:自定义结构体变量导入实战指南

本文详细介绍了如何将C/C++自定义结构体导入Simulink环境,实现无缝数据对接。通过编写标准C头文件、配置MEX编译环境(如MinGW),并利用`Simulink.importExternalCTypes`函数,可将结构体转换为Simulink Bus对象,从而提升复杂系统模型的可读性、可维护性及仿真与代码生成效率。

weixin_29093017的博客 485

Java8函数式编程

最近使用lambda表达式,感觉使用起来非常舒服,箭头函数极大增强了代码的表达能力。于是决心花点时间深入地去研究一下java8的函数式。 (想自学习编程的小伙伴请搜索圈T社区,更多行业相关资讯更有行业相关免费视频教程。完全免费哦!) 一、lambda表达式 先po一个最经典的例子——线程 public static void main(String[] args) { // Java7 n...

wanghao112956的博客 2万+

多模态融合相关概念

多模态图像融合

weixin_43921949的博客 7365

Java函数式编程详解

Java从1.8以后引入了函数式编程,这是很大的一个改进。函数式编程的优点在提高编码的效率,增强代码的可读性。本文历时两个多月一点点写出来,即作为心得,亦作为交流。 1.Java函数式编程的语法: 使用Consumer作为示例,它是一个函数式接口,包含一个抽象方法accept,这个方法只有输入而无输出也就是说这个方法无返回值。 现在我们要定义一个Consumer接口的实例化对象,传统的方式是...

陈大伟的博客 3万+

grafana对接zabbix数据展示

【配置】点击【模板】点击【创建模板】添加三个监控项:【名称】搜索【】创建的模板;点击上方【监控项】,点击创建【监控项】点击上方【触发器】点击【创建触发器】主机关联监控模板:左侧【配置】点击 【主机】点击【Zabbix server】查看:左侧点击【监测】点击【主机】点击【Zabbix server】点击最新数据,找到添加的三个模板主机关联监控模板:左侧【配置】点击 【主机】点击【Zabbix server】把监控模板用起来① 明确获取指标数据的方法。

2401_83883919的博客 6595

基于昇腾MindIE开箱部署Qwen2.5-VL-32B,体验更聪明的多模态理解能力

昇腾MindIE已适配支持Qwen2.5-VL-32B-Instruct并上架魔乐社区,欢迎广大开发者下载体验!

2401_87243659的博客 6874

Java函数式编程入门

函数式编程在Java中不仅能提高代码的简洁性和可读性,还能在处理数据流、并行计算等场景中发挥重要作用。通过掌握Lambda表达式、Stream API、Optional以及其他相关技术,并结合实际业务场景的应用,你将能够更高效地开发出安全、稳定和可维护的系统。建议在日常项目中逐步引入函数式编程思想,从简单的集合操作开始,逐步探索更多高级特性,并结合代码评审和测试不断完善实践经验。/*** 函数式编程*//*** Function<T, R>:接受T类型的参数,返回R类型的结果。

zjh285077371的专栏 1781

YOLO格式数据集【数据增强】终极脚本 | 70+种顶级数据增强方法 | 可带标签增强

YOLO格式数据集【数据增强】终极脚本 | 70+种顶级数据增强方法 | 可带标签增强

Coding... 5503

Java8 函数式编程【基础篇】

而函数式编程(OOF)是对行为进行抽象,主要是抽象函数,是声明式编程风格,其核心是:在思考问题时,使用不可变值和函数,函数对一个值进行处理,映射成另一个值。Java 8是Java在保持向后兼容的前提下首次迈出重要一步,相比之前,不再是只对类库的改良,在编写复杂的集合处理、并行化执行、代码简洁度等方面都有颠覆性的提升。函数接口是只有一个抽象方法的接口,使用只有一个接口来表示某特定方法并反复使用,是一种表示函数的方式。任何需要函数式接口的地方,我们都可以使用Lambda表达式(或方法引用)。

qq_35808136的博客 1824

基于simulink 的不间断电源ups的项目实例

UPS系统的核心组件包括整流器、逆变器、电池管理系统和控制系统。- **Three-Phase Controlled Rectifier**:设置触发角为0度,用于控制整流器的输出电压。- **Three-Phase Inverter**:设置逆变器的输出频率为60Hz,用于将直流电转换为交流电。- **Control System**:编写MATLAB函数,用于监测市电状态并控制各模块的工作模式。- **Step**:设置阶跃时间,例如0.05秒,阶跃前后的值分别为0和1,用于模拟市电中断。

xiaoheshang_123的博客 711

利用AWVS进行反制

awvs 10.5下载 http://www.32r.com/soft/12986.html

渗透之路,攻防之间皆学问 6654

Java 8 函数式编程详解:从思想到实战

函数式接口是 Java 8 函数式编程的 “桥梁”—— 它是有且仅有一个抽象方法的接口(可包含默认方法、静态方法,Java 8 接口增强特性),用于定义 “函数的形状”(输入参数类型、返回值类型)。若内置接口无法满足需求,可自定义函数式接口(需遵循 SAM 规则):java运行// 自定义:接收两个Integer,返回String的函数式接口// 使用:通过Lambda表达式实现接口TwoIntToString sumToString = (a, b) -> "总和:" + (a + b);

2501_94265850的博客 1245

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java8 函数式编程

1.函数式编程思想 a>概念 主要关注对数据进行什么操作, 特点:允许把函数本身作为参数传入另一个函数,还允许返回一个函数! 易于并发编程 2.lambda表达式 a>概念 jdk1.8推出的,对某些匿名内部类写法进行简化, 他是函数编程思想的一个重要体现,不在关注是什么对象,更关注对数据进行什么操作。 b>语法格式 (参数列表)->{代码} ............

我想静静 2451

深度学习工具包 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")

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java 1.8 函数式编程详解

Java 1.8 函数式编程详解 文章目录Java 1.8 函数式编程详解一. 概述1.1 java 8 新特性:二. 函数式接口2.1 函数式接口概述2.2 Lambda表达式概述2.3 java.util.function介绍 一. 概述 1.1 java 8 新特性: 概述: Java 8 正式版是一个有重大改变的版本,该版本对 Java 做了重大改进。本文章主要讲述java 1.8 函...

暗余的博客 2870

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

java8 函数式编程 pdf_java8函数式编程 pdf

java8函数式编程 pdf的重要性就不言而喻了吧。对于每一个JAVA开发者,这都是一个必过的坎。虽然现在的主流编程方式还是面向对象式。当然也不能否认这种方式的健壮性,可扩展性。但是随着编程技术的发展。走在时代前列的函数式编程就粉墨登场了。而这本java8函数式编程就全面介绍了函数式编程的精华,对于很多这种全新的编程理念,大家绝对有必要阅读学习一下。对于JAVA的发展道路非常的有帮助。而这本书主要...

weixin_34277895的博客 1079

Java8——函数式编程

Java8——函数式编程 一、引入 函数式编程语言操纵代码片段就像操作数据一样容易。 虽然 Java 不是函数式语言,但 Java 8 Lambda 表达式和方法引用 (Method References) 允许你以函数式编程。 首先,创建一个名为Talk的接口,接口中只有一个抽象方法,方法名为say public interface Talk { String say(); } 然后创建一个测试类来创建该接口的实例,在之前都习惯于某个类继承该接口,然后创建该类的实例或者是使用匿名内部类的

仲景的博客 1179

实战:Java 8中的函数式编程

函数式编程是一种编程范式(programming paradigm),追求的目标是整个程序都由函数调用(function applying)以及函数组合(function composing)构成的。函数调用大家容易理解,但在函数式编程中,函数调用有一个限制——它不会改变函数以外的其它状态,换而言之,即函数调用不会改变在该函数之外定义的变量值。这种函数有个专门的术语——纯函数(purely function)。纯函数有个特点,当参数值不变的时候,多次运行纯函数,得到的结果总是一样的。

为无为,事无事,味无味。 1623

[Java 8] (1) 函数式编程简介

思维方式的转变 以从一个城市集合中寻找是否存在Chicago为例: 习惯的方式 boolean found = false; for(String city : cities) { if(city.equals("Chicago")) { found = true; break; } } System.out.println("Fo

不忘初心,好好沉淀 1万+

Java基础函数式编程

本篇博文主要总结四个知识点,函数式接口,Java的函数式编程,方法引用,和Stream API。

孤夜的博客 3053

Java函数式编程

简介 什么是函数式编程 函数式编程是一种编程范式,即一切都是数学函数。在Java面向对象编程中,程序是一系列相互作用(方法)的对象,而在函数式编程中,程序会是一个无状态的函数组合序列。 函数是“第一等公民” “第一等公民”指的是函数和其他数据类型一样,处于平等的地位。可以赋值给变量、可以作为另一个函数的参数或者作为一个函数的返回值。比如 // 将两数相加的逻辑赋值给变量sum var sum = (a,b)->a+b; // 将函数作为另一个函数的参数 operation(sum) Java函数试

Mr_Yao 4096

java8 函数式编程_您必须学习Java 8的函数式编程吗?

java8 函数式编程 我最近一直在研究Java 8,并掌握了Manning出版的“ Java 8 In Action” 。 让我印象深刻的第一件事是Java 8独特的销售主张是函数式编程。 函数现在是一流的变量,您可以像int或String一样在代码中传递它们。 这是一个很大的变化。 近年来,功能语言似乎变得越来越流行,并且它们没有尽头可供选择。 现代函数式编程语言的例子包括Cloju...

最佳 Java 编程 680
上一篇: SpringBoot-使用心跳机制+JWT实现用户实时在线数统计
下一篇: SpringBoot学习笔记(14)-整合Spring Data JPA
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值