JAVA8新特性之Stream API

深入探讨Java 8新特性:Stream API和Optional类! 本文深入探讨了Java 8引入的Stream API和Optional类两大特性。Stream API通过声明式编程简化集合操作,支持过滤、映射、排序等常见操作,并提供了高效的并行流处理。Optional类则有效避免了NullPointerException,通过安全容器机制优雅处理空值。文章详细讲解了它们的创建方式、常用方法及适用场景,为开发者提供了优化代码、提升效率的实用指南。这两项特性已成为现代Java开发的必备技能,能显著提高代码质量和可维护性。 阅读详情

1 前言
1.1 对Stream流的个人理解:

  1. 它和IO流是不一样的;
  2. 它是对数据源(集合,数组等)进行一系列的中间操作,产生一个新的流或者说我们想要的结果,并且对数据源不产生影响。
  3. 集合讲的是数据,流讲的是计算。
    个人理解

1.2Stream流操作的三个步骤

  1. 创建Stream
  2. 中间操作:对数据源数据进行处理
  3. 终端操作:执行中间操作,并产生结果

注意: 从终端操作可以看出stream流是延迟执行的,只有执行终端操作(想要需要的结果)的时候才执行中间操作

2 下面我们对Stream的三个步骤一一说明

2.1创建Stream

/**
* 创建流
*/
@Test
public void test01(){
    /**
    * 集合流
    *  - Collection.stream() 穿行流
    *  - Collection.parallelStream() 并行流
    */
    List<String> list = new ArrayList<>();
    Stream<String> stream1 = list.stream();

    //数组流
    //Arrays.stream(array)
    String[] strings = new String[10];
    Stream<String> stream2 = Arrays.stream(strings);

    //Stream 静态方法
    //Stream.of(...)
    Stream<Integer> stream3 = Stream.of(1, 2, 3);

    //无限流
    //迭代
    Stream<Integer> stream4 = Stream.iterate(0, (i) -> ++i+i++);
    stream4.forEach(System.out::println);

    //生成
    Stream.generate(() -> Math.random())
        .limit(5)
        .forEach(System.out::println);
}

2.2中间操作

创建一个list集合,这个集合只是下面例子中用,方便区别各API的用途,可不要误会

 List<Employee> emps = Arrays.asList(
            new Employee(101, "Z3", 19, 9999.99),
            new Employee(102, "L4", 20, 7777.77),
            new Employee(103, "W5", 35, 6666.66),
            new Employee(104, "Tom", 44, 1111.11),
            new Employee(105, "Jerry", 60, 4444.44)
            new Employee(105, "Jerry", 60, 4444.44)
    );
  • filter:接收 Lambda ,从流中排除某些元素
 @Test
    public void test2() {
        emps.stream()
                .filter((emp)->emp.getAge()>20)
                .forEach(System.out::println);
    }
    
    //输出
    Employee(id=103, name=W5, age=35, salary=6666.66)
    Employee(id=104, name=Tom, age=44, salary=1111.11)
    Employee(id=105, name=Jerry, age=60, salary=4444.44)
    Employee(id=105, name=Jerry, age=60, salary=4444.44)
  • limit:截断流,使其元素不超过给定数量
  @Test
    public void test2() {
        emps.stream()
                .filter((emp)->emp.getAge()>20)
                .limit(2)
                .forEach(System.out::println);
    }
     //输出
   Employee(id=103, name=W5, age=35, salary=6666.66)
   Employee(id=104, name=Tom, age=44, salary=1111.11)
  • skip(n):跳过元素,返回一个舍弃了前n个元素的流;若流中元素不足n个,则返回一个空流;与 limit(n) 互补
  @Test
    public void test2() {
        emps.stream()
                .filter((emp)->emp.getAge()>20)
                .limit(2)
                .skip(1)
                .forEach(System.out::println);

    }
    //输出
    Employee(id=104, name=Tom, age=44, salary=1111.11)
  • distinct:筛选,通过流所生成的 hashCode() 与 equals() 取除重复元素

     @Test
    public void test2() {
        emps.stream()
                .filter((emp)->emp.getAge()>20)
                .distinct()
                .forEach(System.out::println);

    }
//输出
Employee(id=103, name=W5, age=35, salary=6666.66)
Employee(id=104, name=Tom, age=44, salary=1111.11)
Employee(id=105, name=Jerry, age=60, salary=4444.44)
  • map:接收 Lambda ,将元素转换为其他形式或提取信息;接受一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素
 @Test
    public void test2() {
        emps.stream()
               .map((emp)->emp.getAge())
                .forEach(System.out::println);
    }
    //输出   19 20 35 44 60 60

  • flatMap(难点):接收一个函数作为参数,将流中每一个值都换成另一个流,然后把所有流重新连接成一个流,可以看做是两层for循环

    • 个人理解:与map()可以看做是一层for循环,flatMap()可以看做是两层for循环

    • 例如下面例子(将两个集合合并为一个集合)

flatMap()操作的一个作用就是将两个集合合并为一个集合,相当于join操作,若没有filter操作,会产生笛卡尔积现象。

//例子中boys和stus分别是boy对象集合和stu对象集合
 List<String> collect = boys.stream().flatMap(b -> stus.stream().
                        //第二层for循环中处理数据
                                filter(s -> b.getName().equals(s.getName())).
                        //将数据放入到一个新的集合中
                                map(Student::getName)
                //结束第二层循环
        ).collect(Collectors.toList());

       //等效于
        List<String> data=new ArrayList<>();
        //双层for循环处理数据
        for (Boy boy : boys) {
            for (Student student : stus) {
                //filter条件
                if(boy.getName().equals(student.getName())){
                    //map子句,将元素放入到新集合中
                    data.add(student.getName());
                }
            }
        }
//参考网址https://www.jianshu.com/p/279967ceb45f
  • sorted():自然排序
SortList.java

package com.concretepage;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
public class SortList {
    public static void main(String[] args) {
        List<Student> list = new ArrayList<Student>();
        list.add(new Student(1, "Mahesh", 12));
        list.add(new Student(2, "Suresh", 15));
        list.add(new Student(3, "Nilesh", 10));

        System.out.println("---Natural Sorting by Name---");
        List<Student> slist = list.stream().sorted().collect(Collectors.toList());
        slist.forEach(e -> System.out.println("Id:"+ e.getId()+", Name: "+e.getName()+", Age:"+e.getAge()));

        System.out.println("---Natural Sorting by Name in reverse order---");
        slist = list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
        slist.forEach(e -> System.out.println("Id:"+ e.getId()+", Name: "+e.getName()+", Age:"+e.getAge()));        

        System.out.println("---Sorting using Comparator by Age---");
        slist = list.stream().sorted(Comparator.comparing(Student::getAge)).collect(Collectors.toList());
        slist.forEach(e -> System.out.println("Id:"+ e.getId()+", Name: "+e.getName()+", Age:"+e.getAge()));

        System.out.println("---Sorting using Comparator by Age with reverse order---");
        slist = list.stream().sorted(Comparator.comparing(Student::getAge).reversed()).collect(Collectors.toList());
        slist.forEach(e -> System.out.println("Id:"+ e.getId()+", Name: "+e.getName()+", Age:"+e.getAge()));
    }
} 

Output *

—Natural Sorting by Name—
Id:1, Name: Mahesh, Age:12
Id:3, Name: Nilesh, Age:10
Id:2, Name: Suresh, Age:15
—Natural Sorting by Name in reverse order—
Id:2, Name: Suresh, Age:15
Id:3, Name: Nilesh, Age:10
Id:1, Name: Mahesh, Age:12
—Sorting using Comparator by Age—
Id:3, Name: Nilesh, Age:10
Id:1, Name: Mahesh, Age:12
Id:2, Name: Suresh, Age:15
—Sorting using Comparator by Age with reverse order—
Id:2, Name: Suresh, Age:15
Id:1, Name: Mahesh, Age:12
Id:3, Name: Nilesh, Age:10

  • sorted(Comparator c):定制排序
 @Test
    public void test2() {
        emps.stream()
              .sorted((e1,e2)->{
                  if (e1.getAge().equals(e2.getAge())){
                      return e1.getName().compareTo(e2.getName());
                  } else {
                      return e1.getAge().compareTo(e2.getAge());
                  }
              })
                .limit(2)
                .forEach(System.out::println);
    }
//输出
Employee(id=101, name=Z3, age=19, salary=9999.99)
Employee(id=102, name=L4, age=20, salary=7777.77)

2.3 终端操作(中间操作可以几个中间操作API连用,而终端操作不能几个终端操作API连用,只能用一个)

  • forEach(): 遍历输出
 @Test
    public void test2() {
        emps.stream()
               .map((emp)->emp.getAge())
                .forEach(System.out::println);
    }
    //输出   19 20 35 44 60 60
  • allMatch:检查是否匹配所有元素
 @Test
    public void test2() {
        boolean b = emps.stream()
                .allMatch(e -> e.getAge() == 19);
        System.out.println(b);//不可以使用forEach(System.out::println);,因为allMatch(e -> e.getAge() == 19);属于终端操作
        
        //输出flase
    }
  • allMatch:检查是否匹配所有元素
  • anyMatch:检查是否至少匹配一个元素
  • noneMatch:检查是否没有匹配所有元素
  • findFirst:返回第一个元素
  • findAny:返回当前流中的任意元素
  • count:返回流中元素的总个数
  • max:返回流中最大值
  • min:返回流中最小值
  • reduce(T identity, BinaryOperator) / reduce(BinaryOperator) 可以将流中的数据反复结合起来,得到一个值
/**
* Java:
*  - reduce:需提供默认值(初始值)
*/
@Test
public void test01(){
    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
    Integer integer = list.stream()
        .reduce(0, (x, y) -> x + y);
    System.out.println(integer);
}
  • collect:将流转换成其他形式(如利用Collectors转化为list,set,map等好多常用API)
 @Test
    public void test2() {
        //转list集合
        List<String> collect = emps.stream()
                .map(employee -> employee.getName())
                .collect(Collectors.toList());
        System.out.println(collect);
  //输出 [Z3, L4, W5, Tom, Jerry, Jerry]
    }
//转map集合
  @Test
    public void test2() {
      
        Map<Integer, List<Employee>> collect = emps.stream()
                .collect(Collectors.groupingBy(Employee::getId));
        System.out.println(collect);

    }
    //输出(从输出可以看出,应该先去重,再转换)
    {101=[Employee(id=101, name=Z3, age=19, salary=9999.99)],
     102=[Employee(id=102, name=L4, age=20, salary=7777.77)], 
     103=[Employee(id=103, name=W5, age=35, salary=6666.66)], 
     104=[Employee(id=104, name=Tom, age=44, salary=1111.11)], 
     105=[Employee(id=105, name=Jerry, age=60, salary=4444.44), Employee(id=105, name=Jerry, age=60, salary=4444.44)]}

//总结
       @Test
    public void test2() {
        //总结
        DoubleSummaryStatistics dss = emps.stream()
                .collect(Collectors.summarizingDouble(Employee::getSalary));
        System.out.println( dss);
        System.out.println(dss.getMax());
        System.out.println(dss.getMin());
        System.out.println(dss.getSum());
        System.out.println(dss.getCount());
        System.out.println(dss.getAverage());

    }
//输出
DoubleSummaryStatistics{count=6, sum=34444.410000, min=1111.110000, average=5740.735000, max=9999.990000}
9999.99
1111.11
34444.409999999996
6
5740.735
//其他API
@Test
public void test02(){
	//放入Set
    Set<String> set = emps.stream()
        .map(Employee::getName)
        .collect(Collectors.toSet());
    set.forEach(System.out::println);

    //放入LinkedHashSet
    LinkedHashSet<String> linkedHashSet = emps.stream()
        .map(Employee::getName)
        .collect(Collectors.toCollection(LinkedHashSet::new));
    linkedHashSet.forEach(System.out::println);
}

@Test
public void test03(){
    //总数
    Long count = emps.stream()
        .collect(Collectors.counting());
    System.out.println(count);

    //平均值
    Double avg = emps.stream()
        .collect(Collectors.averagingDouble(Employee::getSalary));
    System.out.println(avg);

    //总和
    Double sum = emps.stream()
        .collect(Collectors.summingDouble(Employee::getSalary));
    System.out.println(sum);

    //最大值
    Optional<Employee> max = emps.stream()
        .collect(Collectors.maxBy((e1, e2) -> Double.compare(e1.getSalary(), e2.getSalary())));
    System.out.println(max.get());

    //最小值
    Optional<Double> min = emps.stream()
        .map(Employee::getSalary)
        .collect(Collectors.minBy(Double::compare));
    System.out.println(min.get());
}

@Test
public void test04(){
    //分组
    Map<Integer, List<Employee>> map = emps.stream()
        .collect(Collectors.groupingBy(Employee::getId));
    System.out.println(map);

    //多级分组
    Map<Integer, Map<String, List<Employee>>> mapMap = emps.stream()
        .collect(Collectors.groupingBy(Employee::getId, Collectors.groupingBy((e) -> {
            if (e.getAge() > 35) {
                return "开除";
            } else {
                return "继续加班";
            }
        })));
    System.out.println(mapMap);
    
    //分区
    Map<Boolean, List<Employee>> listMap = emps.stream()
        .collect(Collectors.partitioningBy((e) -> e.getSalary() > 4321));
    System.out.println(listMap);
}

@Test
public void test05(){
    //总结
    DoubleSummaryStatistics dss = emps.stream()
        .collect(Collectors.summarizingDouble(Employee::getSalary));
    System.out.println(dss.getMax());
    System.out.println(dss.getMin());
    System.out.println(dss.getSum());
    System.out.println(dss.getCount());
    System.out.println(dss.getAverage());
    
    //连接
    String str = emps.stream()
        .map(Employee::getName)
        .collect(Collectors.joining("-")); //可传入分隔符
    System.out.println(str);
}
  • 完结
掌握Java 8新特性:Stream API与Lambda表达式 Java 8,作为Java历史上一次重大的更新,引入了诸多改变游戏规则的新特性,这些特性不但提升了开发效率,还极大地扩展了Java语言表达能力。其中,Lambda表达式、Stream API、新的日期时间API、Optional类等成为Java 8最大的亮点。这些特性标志着Java从面向对象编程向函数式编程迈出了重要的一步。本章将对Java 8的这些核心特性进行概览,并简要介绍它们各自的特点与作用。 阅读详情

相关推荐

OCC WebGL案例编译实战:从FreeType配置到静态库生成

本文详细记录了将OCC(Open CASCADE Technology)3D图形库编译为WebAssembly(Wasm)并在浏览器中通过WebGL渲染的实战过程。重点解决了FreeType库的交叉编译配置、OCC核心库的裁剪与静态库生成,以及WebGL样例项目的CMake改造等关键步骤,为开发者提供了从环境搭建到最终集成的完整指南。

weixin_28831461的博客 315

Java 基础之详解 Java IO

Java IO 基本概念 Java IO:即 Java 输入 / 输出系统。 区分 Java 的输入和输出:把自己当成程序, 当你从外边读数据到自己这里就用输入(InputStream/Reader), 向外边写数据就用输出(OutputStream/Writer)。 Stream:Java 中将数据的输入输出抽象为流,流是一组有顺序的,单向的,有起点和终点的数据集合,就像水流。按照流中的最...

weixin_30732487的博客 249

智能体在车联网中的应用:第19天 智能体理论与初步实践 D30:阶段小结——在SUMO中使用TraCI控制预编程智能体

本文介绍了如何将强化学习从算法仿真迁移到交通系统实践,重点讲解了SUMO微观交通仿真平台与TraCI实时控制接口的架构。通过构建一个预编程驾驶智能体,演示了车辆从起点到目标点的导航控制。文章详细解析了TraCI的双向通信机制和事件驱动模型,对比了其与传统RL环境的差异,并提供了完整的Python实现框架,包括路网配置、车辆控制和基于向量场的导航逻辑。该实践为后续开发高级学习型交通智能体奠定了基础。

IT深耕十余载,大道之简 1478

流式接口和非流式接口的区别

流式接口和非流式接口主要区别在于数据传输和处理的方式。流式接口适用于实时数据传输和逐步处理的场景,而非流式接口适用于数据整体传输和处理的场景。

m0_69134284的博客 4885

【博弈论基础与几大经典模型】古诺模型、斯塔克尔伯格模型Stackelberg Game、价格领导模型、Bertrand模型、Sweezy模型

博弈论中经典模型☞古诺模型、斯塔克尔伯格模型、价格领导模型等

学习记录 3万+

MPLAB修改工程名称方法

修改工程名称方法 如下图所示,工程名称为:Loar_V1.0_20210205 现将该工程名称修改为:Loar_V1.1_20210205 修改方法: ①找到工程文件路径,将工程名称修改为Loar_V1.1_20210205 注意:此时打开变成进行编译,会报错:Loar_V1.1_20210205.production.hex does not exist or is not an executable, ②找到工程下的 nbproject 文件夹 ③将nbproject文件夹下的文件全部打开,并且将

qq_26195179的博客 1759

Java 学习之路 之 File类(六十三)

File 类时 java.io 包下代表与平台无关的文件和目录,也就是说,如果希望在程序中操作文件和目录,都可以通过 File 类来完成。值得指出的是,不管是文件还是目录都是使用 File 来操作的,File 能新建、删除、重命名文件和目录,File 不能访问文件内容本身。如果需要访问内容本身,则需要使用输入/输出流。 1,访问文件和目录 2,文件过滤器

743

ESP32S3 TLS 握手WIFI可用但是在蜂窝热点下卡死:排查方法与根因

设备卡在等。

摸鱼专家 86

HTTP 1.0协议 1.1协议 流水、非流水方式

HTTP 1.0协议 1.1协议 流水、非流水方式

zijin-jdd的博客 8970

Open Dynamics Engine(ODE)物理引擎教程(1)--下载与安装准备

引言 ODE是一个免费的工业级库,用于模拟关节式刚体动力学,例如地面车辆、腿部生物和虚拟现实环境中的移动对象。它具有快速、灵活、健壮和独立于平台的特点,具有先进的关节、摩擦接触和内置的碰撞检测功能。 项目主页:http://www.ode.org/ 线上手册:http://ode.org/wiki/index.php?title=Manual 本教程为博主亲自亲测过程的总结,转载请注明出处! ...

腿足机器人领域 2216

python实现带符号的二进制数转换十进制数 (附完整源码)

python实现带符号的二进制数转换十进制数 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 554

HTTP非流式请求 vs HTTP流式请求

【代码】HTTP非流式请求 vs HTTP流式请求。

Dontla的博客 1964

【ARMv9 DSU-120 系列 1 -- DSU-120 DynamIQ 概述】

ARMv9架构中的DynamIQ™ Shared Unit-120(简称DSU-120)为一组基于Cortex-A类架构的核心提供了共享的L3内存系统、窥探控制(snoop control)和 过滤(filtering) 以及其他支持集群运作的控制逻辑。这个集群被称为DSU-120 DynamIQ™集群。此外,所有连接到片上系统(SoC)的外部接口也都是通过DSU-120提供的。一个DSU-120 DynamIQ™集群可以包含1到14个核心,且同一集群中可包含多达三种不同类型的核心。

CodingCos的博客 1185

Java 8 Stream API 新特性详解及实践

Java 自从推出 8.0 版本以来,带来了许多全新的特性,比如 Lambda 表达式、Stream API、函数式接口等,这些特性极大地提升了开发效率和代码可读性。其中,Stream API 是用于处理集合的强大工具,能够以声明性方式执行复杂的数据处理任务,而不必显式编写迭代逻辑。 本文将通过一个示例代码,详细介绍 Stream API 的特点及用法,并扩展讨论 Java 8 新特性的其他重要方面。通过深入分析,帮助读者理解如何高效利用这些新特性编写简洁、优雅的代码。

cooldream2009的博客 1029

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

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java8 新特性 —— Stream API 详解

Stream作为Java 8的一大亮点,它专门针对集合的各种操作提供各种非常便利、简单、高效的API,Stream API主要是通过Lambda表达式完成,极大的提高了程序的效率和可读性,同时Stram API中自带的并行流使得并发处理集合的门槛再次降低,使用Stream API编程无需多写一行多线程的代码就可以非常方便的写出高性能的并发程序。使用Stream API能够使代码更加优雅。

知唔猪的博客 1933

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【java8新特性系列】 stream api

Stream API是Java 8引入的新特性,用于处理集合数据和数组的高级抽象。它提供了一种流式操作的方式,可以更简洁、高效地对数据进行处理和转换。

wang2leee的博客 112

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java8新特性之三:Stream API

https://www.cnblogs.com/wuhenzhidu/p/10740091.html

qq_33923684的博客 118

Java 8常用新特性Lambda表达式与Stream API使用实例

Java8 新增了很多特性,本文主要介绍使用: Lambda 表达式 − Lambda允许把函数作为一个方法的参数。 Stream API −新添加的Stream API(java.util.stream) 函数式编程风格的引入。 更多的新特性可以参阅官网:What’s New in JDK 8 前置准备 创建一个测试类 /** * @author 码农猿 */ public class ...

程序员小强的博客 6824

Java8新特性之Stream API

概述 Stream API 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用fork/join并行方式来拆分任务和加速处理过程。总得来说,Stream API 就是提供了一种高效且易于使用的处理数据的方式。 注:需要会使用 Lambda 表达...

MOKE_SPACE 1378

Java 8 新特性全面解析:Lambda 表达式、Stream API 等的应用

一、引言Java 8 作为 Java 语言发展历程中的重要版本,带来了诸多革命性的新特性,其中 Lambda 表达式和 Stream API 是最受关注的两大创新。这些新特性不仅借鉴了函数式编程的思想,还针对 Java 开发者在实际开发中遇到的痛点进行了优化,使得 Java 代码在保持面向对象特性的同时,具备了更加简洁、高效和灵活的表达能力。通过 Lambda 表达式,开发者可以以更简洁的方式实现函数式接口,而 Stream API 则为集合数据的处理提供了强大的工具,大大简化了数据处理逻辑。

数字魔方操控师的博客 911

java 8 stream api_JDK8新特性——Stream API

JDK8新特性——Stream API摘要:本文主要学习了JDK8的新特性中有关Stream API的使用。部分内容来自以下博客:https://blog.youkuaiyun.com/icarusliu/article/details/79495534概述Stream API(java.util.stream)把真正的函数式编程风格引入到Java中。这是目前为止对Java类库最好的补充,因为Stream A...

weixin_39796533的博客 129

Java8新特性-Stream API 常用完整版

流(Stream) 1. 流的概念 2. 流的操作步骤 2.1. 创建Stream 2.1.1 通过Collection 系列集合提供的串行流:stream()、并行流: paralleStream() 2.1.2 通过Arrays中的静态方法stream(T[] array) 获取数组流 2.1.3 通过Stream类中的静态方法 of() 2.1.4 使用Stream类的静态方法 iter...

胡啊呦的博客 1万+

java8 新特性4 Stream Api-1

stream 是java8的新特性,用于操作java中list,set,map等存储结合中的元素。1.stream 自己不会存储元素2.stream不会改变源对象,相反,他们会返回一个持有结果的新stream。3.stream操作是延迟执行的,也就是说等到有结果的时候才执行。

健康平安的活着的专栏 795

java steam reduce_Java 8新特性:Stream API与Date API

除此之外,Java8 API中包含了很多内建的函数式接口,这些接口都增加了@FunctionalInterface注解以便能用在lambda表达式上。它还提供了很多全新的函数式接口来让工作更加方便,其中有很多是来自我们熟悉的第三方类库Guava。Steam APIStream API是Java8类库的核心,它能够应用在一组元素上一次执行的操作序列。Stream操作分为中间操作或者最终操作两种,最终...

weixin_33331559的博客 828

Java8 新特性之 Lambda 表达式和 Stream API

Stream API 的操作中,中间操作可以有多个,但是终止操作只能有一个中间操作并不会立即执行,而是返回一个新的 Stream 流,只有在触发终止操作的时候,才会触发计算,返回流的计算结果。

2401_82656016的博客 1170

java 8 新特性(二) stream API

java 8 新特性(二) stream API stram的三个操作 : 创建stram 中间操作 终止操作(终端操作) 一、创建stream的几种方式: // 第一种: 可以通过Collection 系列集合提供的 stream() 或 parallelStream() Map<String,Object> map = new HashMap<>(); employees.stream(); // 串...

码农云云的博客 207
上一篇: SpringBoot集成Swagger2
下一篇: JAVA8新特性之Optional<T> 类
jothan_lee
博客等级 码龄9年 30粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值