【读书笔记】《写给大忙人看的Java SE 8》——Java8新特性总结

jdk8新特性 只包含一个抽象方法的接口,称为函数式接口。你可以通过 Lambda 表达式来创建该接口的对象。(若 Lambda 表达式 抛出一个受检异常(即:非运行时异常),那么该异常需要在目标接口的抽 象方法上进行声明)。我们可以在一个接口上使用注解,这样做可以检 查它是否是一个函数式接口。同时 javadoc 也会包含一条声明,说明这个 接口是一个函数式接口。在java.util.function包下定义了Java 8 的丰富的函数式接口// 函数式接口中使用泛型:Stream到底是什么呢? 阅读详情

原文来自:https://www.cnblogs.com/justcooooode/p/7701260.html

接口中的默认方法和静态方法

先考虑一个问题,如何向Java中的集合库中增加方法?例如在Java 8中向Collection接口中添加了一个forEach方法。

如果在Java 8之前,对于接口来说,其中的方法必须都为抽象方法,也就是说接口中不允许有接口的实现,那么就需要对每个实现Collection接口的类都需要实现一个forEach方法。

但这就会造成在给接口添加新方法的同时影响了已有的实现,所以Java设计人员引入了接口默认方法,其目的是为了解决接口的修改与已有的实现不兼容的问题,接口默认方法可以作为库、框架向前兼容的一种手段。

默认方法就像一个普通Java方法,只是方法用default关键字修饰。

下面来举一个简单的例子

复制代码
public interface Person {
    //默认方法
    default String getName(String name) {
        return name;
    }
}
///////////////////////////////////////////////////////////////////////
public class Student implements Person {

}
//////////////////////////////////////////////////////////////////////
public class Test {
    public static void main(String[] args) {
        Person p = new Student();
        String name = p.getName("小李");
        System.out.println(name);
    }
}
复制代码

我们定义了一个Person接口,其中getName是一个默认方法。接着编写一个实现类,可以从结果中看到,虽然Student是空的,但是仍然可以实现getName方法。

显然默认接口的出现打破了之前的一些基本规则,使用时要注意几个问题。

考虑如果接口中定义了一个默认方法,而另外一个父类或者接口中又定义了一个同名的方法,该选择哪个?

1. 选择父类中的接口。如果一个父类提供了具体的实现方法,那么接口中具有相同名称和参数的默认方法会被忽略。

2. 接口冲突。如果一个父接口提供了一个默认方法,而另一个接口也提供了具有相同名称和参数类型的方法(不管该方法是否是默认方法),那么必须通过覆盖方法来解决。

记住一个原则,就是“类优先”,即当类和接口都有一个同名方法时,只有父类中的方法会起作用。

“类优先”原则可以保证与Java 7的兼容性。如果你再接口中添加了一个默认方法,它对Java 8以前编写的代码不会产生任何影响。

下面来说说静态方法。

静态方法就像一个普通Java静态方法,但方法的权限修饰只能是public或者不写。

默认方法和静态方法使Java的功能更加丰富。

在Java 8中Collection接口中就添加了四个默认方法,stream()、parallelStream()、forEach()和removeIf()。Comparator接口也增加了许多默认方法和静态方法。

函数式接口和Lambda表达式

函数式接口(Functional Interface)是只包含一个方法的抽象接口。

比如Java标准库中的java.lang.Runnable,java.util.concurrent.Callable就是典型的函数式接口。

在Java 8中通过@FunctionalInterface注解,将一个接口标注为函数式接口,该接口只能包含一个抽象方法。

@FunctionalInterface注解不是必须的,只要接口只包含一个抽象方法,虚拟机会自动判断该接口为函数式接口。

一般建议在接口上使用@FunctionalInterface注解进行声明,以免他人错误地往接口中添加新方法,如果在你的接口中定义了第二个抽象方法的话,编译器会报错。

函数式接口是为Java 8中的lambda而设计的,lambda表达式的方法体其实就是函数接口的实现。

为什么要使用lambda表达式?

“lambda表达式”是一段可以传递的代码,因为他可以被执行一次或多次。我们先回顾一下之前在Java中一直使用的相似的代码块。

当我们在一个线程中执行一些逻辑时,通常会将代码放在一个实现Runnable接口的类的run方法中,如下所示:

复制代码
new Thread(new Runnable(){
            @Override
            public void run() {
                for (int i = 0; i < 10; i++)
                    System.out.println("Without Lambda Expression");
            }}).start();
复制代码

然后通过创建实例来启动一个新的线程。run方法内包含了一个新线程中需要执行的代码。

再来看另一个例子,如果想利用字符串长度排序而不是默认的字典顺序排序,就需要自定义一个实现Comparator接口的类,然后将对象传递给sort方法。

复制代码
class LengthComparator implements Comparator<String> {
    @Override
    public int compare(String s1, String s2) {
        return Integer.compare(s1.length(), s2.length());
    }
}
Arrays.sort(strings, new LengthComparator());
复制代码

按钮回调是另一个例子。将回调操作放在了一个实现了监听器接口的类的一个方法中。

复制代码
JButton button = new JButton("click");

button.addActionListener(new ActionListener() {    
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Without Lambda Expression");
    }
});
复制代码

这三个例子中,出现了相同方式,一段代码被传递给其他调用者——一个新线程、是一个排序方法或者是一个按钮。这段代码会在稍后被调用。

在Java中传递代码并不是很容易,不可能将代码块到处传递。你不得不构建一个类的对象,由他的某个方法来包含所需的代码。

而lambda表达式实际上就是代码块的传递的实现。其语法结构如下:

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

括号里的参数可以省略其类型,编译器会根据上下文来推导参数的类型,你也可以显式地指定参数类型,如果没有参数,括号内可以为空。

方法体,如果有多行功能语句用大括号括起来,如果只有一行功能语句则可以省略大括号。

new Thread(() -> {
            for (int i = 0; i < 100; i++)
                System.out.println("Lambda Expression");
        }).start();
Comparator<String> c = (s1, s2) -> Integer.compare(s1.length(), s2.length());
button.addActionListener(e -> System.out.println("Lambda Expression"));

可以看到lambda表达式使代码变得简单,代替了匿名内部类。

下面来说一下方法引用,方法引用是lambda表达式的一种简写形式。 如果lambda表达式只是调用一个特定的已经存在的方法,则可以使用方法引用。

使用“::”操作符将方法名和对象或类的名字分隔开来。以下是四种使用情况:

  • 对象::实例方法
  • 类::静态方法
  • 类::实例方法
  • 类::new
Arrays.sort(strings, String::compareToIgnoreCase);
// 等价于
Arrays.sort(strings, (s1, s2) -> s1.compareToIgnoreCase(s2));

上面的代码就是第三种情况,对lambda表达式又一次进行了简化。

Stream API

当处理集合时,通常会迭代所有元素并对其中的每一个进行处理。例如,我们希望统计一个字符串类型数组中,所有长度大于3的元素。

复制代码
String[] strArr = { "Java8", "new", "feature", "Stream", "API" };
        int count = 0;
        for (String s : strArr) {
            if (s.length() > 3)
                count++;
        }
复制代码

通常我们都会使用这段代码来统计,并没有什么错误,只是它很难被并行计算。这也是Java8引入大量操作符的原因,在Java8中,实现相同功能的操作符如下所示:

long count = Stream.of(strArr).filter(w -> w.length() > 3).count();

stream方法会为字符串列表生成一个Stream。filter方法会返回只包含字符串长度大于3的一个Stream,然后通过count方法计数。

一个Stream表面上与一个集合很类似,允许你改变和获取数据,但实际上却有很大区别:

  1. Stream自己不会存储元素。元素可能被存储在底层的集合中,或者根据需要产生出来。
  2. Stream操作符不会改变源对象。相反,他们返回一个持有新结果的Stream。
  3. Stream操作符可能是延迟执行的。意思是它们会等到需要结果的时候才执行。

Stream相对于循环操作有更好的可读性。并且可以并行计算:

long count = Arrays.asList(strArr).parallelStream().filter(w -> w.length() > 3).count();

只需要把stream方法改成parallelStream,就可以让Stream去并行执行过滤和统计操作。

Stream遵循“做什么,而不是怎么去做”的原则。只需要描述需要做什么,而不用考虑程序是怎样实现的。

Stream很像Iterator,单向,只能遍历一遍。但是Stream可以只通过一行代码就实现多线程的并行计算。

当使用Stream时,会有三个阶段:

  1. 创建一个Stream。
  2. 在一个或多个步骤中,将初始Stream转化到另一个Stream的中间操作。
  3. 使用一个终止操作来产生一个结果。该操作会强制他之前的延迟操作立即执行。在这之后,该Stream就不会在被使用了。

从着三个阶段来看,对应着三种类型的方法,首先是Stream的创建方法。

复制代码
// 1. Individual values
Stream stream = Stream.of("a", "b", "c");
// 2. Arrays
String [] strArray = new String[] {"a", "b", "c"};
stream = Stream.of(strArray);
stream = Arrays.stream(strArray);
// 3. Collections
List<String> list = Arrays.asList(strArray);
stream = list.stream();
复制代码

中间操作包括:map (mapToInt, flatMap 等)、 filter、distinct、sorted、peek、limit、skip、parallel、sequential、unordered。

终止操作包括:forEach、forEachOrdered、toArray、reduce、collect、min、max、count、anyMatch、allMatch、noneMatch、findFirst、findAny、iterator。

关于Stream的每个方法如何使用就不展开了,更详尽的介绍看这篇文章:https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/

新的日期和时间 API

Java8 引入了一个新的日期和时间API,位于java.time包下。

新的日期和时间API借鉴了Joda Time库,其作者也为同一人,但它们并不是完全一样的,做了很多改进。

下面来说一下几个常用的类。首先是Instant,一个Instant对象表示时间轴上的一个点。

Instant.now()会返回当前的瞬时点(格林威治时间)。Instant.MIN和Instant.MAX分别为十亿年前和十亿年后。

如下代码可以计算某算法的运行时间:

复制代码
Instant start = Instant.now();
runAlgorithm();
Instant end = Instant.now();
Duration timeElapsed = Duration.between(start, end);
long millis = timeElapsed.toMillis();
复制代码

Duration对象表示两个瞬时点间的时间量。可以通过不同的方法,换算成各种时间单位。

上面所说的绝对时间并不能应用到生活中去,所以新的Java API中提供了两种人类时间,本地日期/时间和带时区的时间。

LocalDate是一个带有年份、月份和天数的日期。创建他可以使用静态方法now或者of。

复制代码
LocalDate today = LocalDate.now();
LocalDate myBirthday = LocalDate.of(1994, 03, 15);
// use Enum
myBirthday = LocalDate.of(1994, Month.MARCH, 15);

System.out.println(today); // 2017-10-23
System.out.println(myBirthday); // 1994-03-15
复制代码

下面是LocalDate中的一些常用方法:

LocalTime表示一天中的某个时间,同样可以使用now或者of来创建实例。

LocalTime rightNow = LocalTime.now();
LocalTime bedTime = LocalTime.of(2, 0);
System.out.println(rightNow); // 01:26:17.139
System.out.println(bedTime); // 02:00

LocalDateTime表示一个日期和时间,用法和上面类似。

上面几种日期时间类都属于本地时间,下面来说一下带时区的时间。

ZonedDateTime通过设置时区的id来创建一个带时区的时间。

ZonedDateTime beijingOlympicOpenning = ZonedDateTime.of(2008, 8, 8, 20, 0, 0, 0, ZoneId.of("Asia/Shanghai"));
System.out.println(beijingOlympicOpenning); // 2008-08-08T20:00+08:00[Asia/Shanghai]

更新后的API同样加入了新的格式化类DateTimeFormatter。DateTimeFormatter提供了三种格式化方法来打印日期/时间:

  • 预定义的标准格式
String formattered = DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(beijingOlympicOpenning);
System.out.println(formattered); // 2008-08-08T20:00:00

DateTimeFormatter类提供了多种预定义的标准格式可供使用。

  • 语言环境相关的格式

标准格式主要用于机器可读的时间戳。为了让人能够读懂日期和时间,你需要使用语言环境相关的格式。

Java8提供了4种风格,SHORT、MEDIUM、LONG、FULL。

复制代码
String formattered = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).format(beijingOlympicOpenning);
System.out.println(formattered);    //2008年8月8日 星期五 下午08时00分00秒 CST
复制代码
  • 自定义的格式

或者你也可以自定义日期和时间的格式。

String formattered = DateTimeFormatter.ofPattern("E yyyy-MM-dd HH:mm").format(beijingOlympicOpenning);
System.out.println(formattered); // 星期五 2008-08-08 20:00

  下图中为一些常用的模式元素。

新的API提供了从字符串解析出日期/时间的parse静态方法和与遗留类(java.util.Date、java.sql.Time和java.txt.DateFormat等)互相转换的方法。

杂项改进

 Java8在String类中只添加了一个新方法,就是join,该方法实现了字符串的拼接,可以把它看作split方法的逆操作。

String joined = String.join(".", "www", "cnblogs", "com");
System.out.println(joined); // www.cnblogs.com

数字包装类提供了BYTES静态方法,以byte为单位返回长度。

所有八种包装类都提供了静态的hashCode方法。

Short、Integer、Long、Float和Double这5种类型分别提供了了sum、max和min,用来在流操作中作为聚合函数使用。

集合类和接口中添加的方法:

Java8为使用流读取文件行及访问目录项提供了一些简便的方法(Files.lines和Files.list)。同时也提供了进行Base64编码/解码的方法。

Java8对GUI编程(JavaFX)、并发等方面也做了改进,本文没有一一列出。


转载请注明原文链接:http://www.cnblogs.com/justcooooode/p/7701260.html


【JavaSE】jdk8新特性 尚硅谷JavaSE笔记——jdk8新特性。个人实践总结,知识记忆架构不一定适合所有人,建议先阅读文章目录 阅读详情

相关推荐

STM32 热敏电阻测量温度

1、硬件 STM32F103C8T6、热敏电阻传感器、OLED。 2、热敏电阻传感器的介绍

weixin_54721788的博客 1万+

JDK8的新特性

java8 的新特性

huyulong0612的博客 5619

FDTD仿真进阶:液晶偏振调控与双折射效应全解析

本文深入解析了在Lumerical FDTD仿真中如何对液晶材料进行偏振调控与双折射效应建模。通过单轴液晶和螺旋扭曲液晶(TN-LCD)两大实战案例,详细阐述了从各向异性材料参数设置、LC网格属性配置到偏振椭圆分析的全流程,帮助工程师精准模拟液晶的光开关行为,优化如显示器等器件的光学性能。

chair的专栏 747

JDK8新特性介绍

JDK8新特性介绍 JDK8新特性: ​ 1,Lambda表达式 ​ 2,新的日期API ​ 3,引入Optional ​ 4,使用Base64 ​ 5,接口的默认方法和静态方法 ​ 6,新增方法引用格式 ​ 7,新增Stream类 ​ 8,注解相关的改变 ​ 9,支持并行(parallel)数组 ​ 10,对并发类(Concurrency)的扩展。 1,Lambda表达式 Lambda 表...

偏偏爱吃梨的博客 1768

期货分仓系统CTP协议/国内期货软件源码

期货分仓系统与CTP协议以及国内期货软件源码是期货交易技术领域的几个重要方面。

q2247238820的博客 962

通信算法之320:DJI无人机云哨--信息包类型

大疆DJI无人机的云哨信息包主要分为四种类型:1)含经纬度位置、型号及序列号的完整数据包;2)仅含序列号的简化数据包;3)完全加密的数据包;4)加密密钥包。这些信息包格式不同,解析方式和应用场景也各异。如需更详细的技术资料,可联系作者获取。

leegang12的专栏 761

读书笔记--《写给大忙人的JavaSE 9 核心技术》—接口和lambda表达式

读书笔记–《写给大忙人的JavaSE 9 核心技术》—第3章 接口和lambda表达式 接口 它可以让你在不提供实现的情况下,指定应该做什么。(主要在设计阶段用得到) 示例代码 public interface Test1 { // 接口中的方法默认为public public void saySomething(String something); // 在接口中可以定义...

crxk_的博客 4963

⭐️VMwareWorkstation17.0虚拟机搭建WindowsXP虚拟机(完整安装步骤详细图文教程)

Windows XP是微软公司研发的计算机操作系统,于2001年10月25日正式发布。其名字中“XP”的意思来自英文中的“体验”(Experience)。Windows XP使用了Luna图形用户界面和双列开始菜单,提升了系统的安全性和工作性能,提供了WiFi支持,简化了软件的安装和运行,并增加了远程桌面功能。

Python老吕的博客 1万+

读书笔记《写给大忙人的JavaSE 9 核心技术》第一章 基本的编程结构

读书笔记《写给大忙人的JavaSE 9 核心技术》 第一章 基本的编程结构 关于Java用途的定义 Java 不是用来快速完成几个命令的脚本语言,它明确定位为可以从组织有序的类和包以及模块中获益的大型程序的编程语言 JShell Java 9中引入的运行Java语句的交互式命令窗口,和Python Node差不多。 基本类型 8种基本类型 有符号整型 类型 存储需求 byte 1个...

crxk_的博客 4371

Win7/10/11文件拖拽导致资源管理器闪退问题

最近老是遇到把文件从资源管理器拖动到微信或者浏览器时,资源管理器直接闪退的问题,一开始在公司遇到了还以为是电脑配置太低,直到被封闭在家办公,发现自己的高级电脑也有这个问题,那就来了解了解问题是出在什么地方把。

Nicer_feng's blog 1万+

【WRF模拟】土地利用类型的确定:最大覆盖法/瓦片法

土地利用类型的确定:最大覆盖法/瓦片法

WW、forever的博客 1529

写给大忙人看的JavaSE8 阅读笔记之一

JAVA 是一种强类型的语言lambda 表达式语法以排序为例,我们传递代码来检查某个字符串的长度是否小于另一个字符串的长度Integer.compare(first.length(),second.length())first与second都是字符串,JAVA是一个强类型的语言,因此我们必须同时指定类型。(String first,String second)-&gt;Integer.compa...

在下于不同 977

026、传感器校准:加速度计校准

本文详细介绍了无人机飞控系统中加速度计的校准方法。作者从一次炸机事故引入,强调加速度计校准的重要性。文章首先解释了加速度计测量原理和误差来源,包括零偏、尺度因子和交叉轴耦合。重点介绍了两种校准方法:六位置法利用重力作为参考,操作简单但精度有限;椭球拟合通过采集大量数据点进行最小二乘拟合,精度更高但实现复杂。文章还指出温度补偿这一常被忽视的关键因素,并分享了实际调试中的经验教训,包括采样时长、安装误差、验证方法等。最后建议初学者从六位置法入手,逐步优化校准精度,强调良好的校准是飞控性能的基础。

2401_88858637的博客 45

读书笔记--泛型编程--《写给大忙人的JavaSE 9 核心技术》—第6章

读书笔记–《写给大忙人的JavaSE 9 核心技术》—第6章 泛型编程 Java是强类型的语言,对于函数中的参数需要声明其类型,当需要实现适用于多中类型的方法和类时,此时需要用到泛型。 泛型类 public class Test1<K,V> { public test1(K key,V value) { System.out.println(key); ...

crxk_的博客 3826

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

《写给大忙人看的java SE8》笔记 -- 2. Stream

stream简介 stream是一个java.util.stream.Stream对象。各种集合类都添加了创建stream的方法,如list.stream(), list.parallelStream()。Stream接口也包含了各种创建stream的静态方法。 wordlist.stream().filter(w -> w.length() > 10).count(); stream的特点

groovy2007的专栏 1188

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

Java 8 你需要掌握的新特性

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34001430的博客 93

java se 8 for_Java SE 8 for the Really Impatient读书笔记——Java 8 Lambda表达式

1. lambda表达式的语法lambda表达式是一种没有名字的函数,它拥有函数体和参数。lambda表达式的语法十分简单:参数->主体。通过->来分离参数和主体。1.1 参数lambda表达式可以有零个参数,一个参数或多个参数,参数可以指定类型,在编译器可以推导出参数类型的情况下,也可以省略参数类型。两个参数的例子:(String first, String second)->...

weixin_34873494的博客 112

《给大忙人看的java8》摘抄

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34357928的博客 117

Java核心技术卷读书笔记------Java SE8的流库(一)

Java SE8的流库 流提供了一种让我们可以在比集合更高的概念级别上指定计算的数据视图。 它是用来以“做什么而非怎么做”的方式处理集合 1.1 从迭代到流的操作 迭代是对集合进行处理时所用到的行为。 //对集合进行迭代操作 String content = "aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj,kkk,lll,mmm,nnn,o,p,q,r"; List<String> strings = Arrays.asList(

cz_chen_zhuo的博客 206

《Java8实战》读书笔记13:Java8 与 Scala

见识一下 与 做个对比 。 这是官方提供的在线环境用于新手了解Scala :https://scastie.scala-lang.org/ scala3 如下:(莫非强制加返回类型?) 直接看个截图吧: 用于完成到的。 声明,可读写。 声明,是只读的。 可显示声明变量类型。不过Scala可以替你推断变量的类型。 2. 不可变与可变的比较 的集合只读`的。(Scala并未强制你必须使用不可变集合,只是各种暗示你接受这种风格) 可见其推荐的 就是将变化部分创建副本,并引用无变化的部分。得到

灵台方寸山斜月三星洞 730

读书笔记 - 剑指Java:核心原理与应用实践

1995年Sun(Stanford UniversityNetwork)公司开发了一门新的编程语言——Java。Java语言是由詹姆斯·高斯林(James Gosling)和其Green Team小组成员共同开发的。Java的最初名为Oak,由于Oak商标已经被注册,所以更名为Java。1996年是Java语言的发展简史中具有里程碑意义的一年。

qiushily2030的博客 972

读书笔记——《Java核心技术》第二卷

第一章 《Java SE8 流库》 1.从迭代到流的操作 流操作比迭代操作更易读 将stream改为parallelStream就可以让流库进行并行的操作 流不储存其元素 流的操作不会修改其数据源 流的操作是尽可能惰性执行的 可以使用Collection接口的stream方法将任何集合转换成一个流,也可以通过Stream.of方法来将数组转换成一个流,并且of方法具有可变长参数 Array.stream(array,from,to)可以从数组中位于from(包括)和to(不包括)的元素中创建

weixin_44051003的博客 2200

Thinking in Java读书笔记

Thinking in Java读书笔记(IO和并发除外) 1.1、类中所有的private方法都隐式地指定为final的,由于其他类无法取用private方法,所以也就无法覆盖它;private方法无法被重写,继承对应private的方法无效,private的属性也无法拿到,但我们通常private的属性有对应的get、set方法,通常是public的,所以子类继承后可以调用方法来取得到父类的...

yjclsx的博客 42万+
上一篇: 单例模式[Java实现]
下一篇: SpringBoot 异步线程简单三种样式
SnakeMoving
博客等级 码龄11年 65粉丝 97原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值