简化你的Java代码,让工作更高效|语言

方法与函数:让代码更高效、更有条理! 哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛 阅读详情

计算机专家在问题求解时非常重视表达式简洁性的价值。Unix的先驱者Ken Thompson曾经说过非常著名的一句话:“丢弃1000行代码的那一天是我最有成效的一天之一。”这对于任何一个需要持续支持和维护的软件项目来说,都是一个当之无愧的目标。早期的Lisp贡献者Paul Graham甚至将语言的简洁性等同为语言的能力。这种对能力的认识让可以编写紧凑、简介的代码成为许多现代软件项目选择语言的首要标准。

任何程序都可以通过重构,去除多余的代码或无用的占位符,如空格,变得更加简短,不过某些语言天生就善于表达,也就特别适合于简短程序的编写。认识到这一点之后,Perl程序员普及了代码高尔夫竞赛;其目标是用尽可能短的代码量解决某一特定的问题或者实现某个指定的算法。APL语言的设计理念是利用特殊的图形符号让程序员用很少量的代码就可以编写功能强大的程序。这类程序如果实现得当,可以很好地映射成标准的数学表达式。简洁的语言在快速创建小脚本时非常高效,特别是在目的不会被简洁所掩盖的简洁明确的问题域中。

相比于其他程序设计语言,Java语言的冗长已经名声在外。其主要原因是由于程序开发社区中所形成的惯例,在完成任务时,很多情况下,要更大程度地考虑描述性和控制。例如,长期来看,长变量名会让大型代码库的可读性和可维护性更强。描述性的类名通常会映射为文件名,在向已有系统中增加新功能时,会显得很清晰。如果能够一直坚持下去,描述性名称可以极大简化用于表明应用中某一特定的功能的文本搜索。这些实践让Java在大型复杂代码库的大规模实现中取得了极大的成功。

对于小型项目来说,简洁性则更受青睐,某些语言非常适于短脚本编写或者在命令提示符下的交互式探索编程。Java作为通用性语言,则更适用于编写跨平台的工具。在这种情况下,“冗长Java”的使用并不一定能够带来额外的价值。虽然在变量命名等方面,代码风格可以改变,不过从历史情况来看,在一些基本的层面上,与其他语言相比,完成同样的任务,Java语言仍需更多的字符。为了应对这些限制,Java语言一直在不断地更新,以包含一些通常称为“语法糖”的功能。用这些习语可以实现更少的字符表示相同功能的目标。与其对应的更加冗长的配对物相比,这些习语更受程序开发社区的欢迎,通常会被社区作为通用用法快速地采用。

本文将着重介绍编写简洁Java代码的最佳实践,特别是关于JDK8中新增的功能。简而言之,Java 8中Lambda表达式的引入让更加优雅的代码成为可能。这在用新的Java Streaming API处理集合时尤其明显。

冗长的Java

Java代码冗长之所以名声在外,一部分原因是由于其面向对象的实现风格。在许多语言中,只需要一行包含不超过20个字符的代码就可以实现经典的“Hello World”程序示例。而在Java中,除了需要类定义中所包含的main方法之外,在main方法中还需要包含一个方法调用,通过System.out.println()将字符串打印到终端。即使在使用最少的方法限定词、括号和分号,并且将所有空格全都删除的极限情况下,“Hello World”程序最少也需要86个字符。为了提高可读性,再加上空格和缩进,毋庸置疑,Java版的“Hello World”程序给人的第一印象就是冗长。

Java代码冗长一部分原因还应归咎于Java社区将描述性而非简洁性作为其标准。就这一点而言,选择与代码格式美学相关的不同标准是无关紧要的。此外,样板代码的方法和区段可以包含在整合到API中的方法中。无需牺牲准确性或清晰度,着眼于简洁性的程序代码重构可以大大简化冗余Java代码。

有些情况下,Java代码冗长之所以名声在外是由于大量的老旧代码示例所带来的错觉。许多关于Java的书籍写于多年之前。由于在整个万维网最初兴起时,Java便已经存在,许多Java的在线资源所提供的代码片段都源自于Java语言最早的版本。随着时间的推移,一些可见的问题和不足不断得到完善,Java语言也日趋成熟,这也就导致即使十分准确并实施的当的案例,可能也未能有效利用后来的语言习语和API。

Java的设计目标包括面向对象、易于上手(在当时,这意味着使用C++格式的语法),健壮、安全、可移植、多线程以及高性能。简洁并非其中之一。相比于用面向对象语法实现的任务,函数式语言所提供的替代方案要简洁的多。Java 8中新增的Lambda表达式改变了Java的表现形式,减少了执行许多通用任务所需的代码数量,为Java开启了函数式编程习语的大门。

函数式编程

函数式编程将函数作为程序开发人员的核心结构。开发人员可以以一种非常灵活的方式使用函数,例如将其作为参数传递。利用Lambda表达式的这种能力,Java可以将函数作为方法的参数,或者将代码作为数据。Lambda表达式可以看作是一个与任何特定的类都无关的匿名方法。这些理念有着非常丰富多彩并且引人入胜的数学基础。

函数式编程和Lambda表达式仍然是比较抽象、深奥的概念。对于开发人员来说,主要关注如何解决实际生产中的任务,对于跟踪最新的计算趋势可能并不感兴趣。随着Lambda表达式在Java中的引入,对于开发人员来说对这些新特性的了解至少需要能够达到可以读懂其他开发人员所编写代码的程度。这些新特性还能带来实际的好处——可以影响并发系统的设计,使其拥有更优的性能。而本文所关心的是如何利用这些机制编写简洁而又清晰的代码。

之所以能够用Lambda表达式生成简洁的代码,有如下几个原因。局部变量的使用量减少,因此声明和赋值的代码也随之减少。循环被方法调用所替代,从而将三行以上的代码缩减为一行。本来在嵌套循环和条件语句中的代码现在可以放置于一个单独的方法中。实现连贯接口,可以将方法以类似于Unix管道的方式链接在一起。以函数式的风格编写代码的净效应并不只限于可读性。此类代码可以避免状态维护并且不会产生副作用。这种代码还能够产生易于并行化,提高处理效率的额外收益。

Lambda表达式
与Lambda表达式相关的语法比较简单直白,不过又有别于Java之前版本的习语。一个Lambda表达式由三部分组成,参数列表、箭头和主体。参数列表可以包含也可以不包含括号。此外还新增了由双冒号组成的相关操作符,可以进一步缩减某些特定的Lambda表达式所需的代码量。这又称为方法引用。

线程创建
在这个示例中,将会创建并运行一个线程。Lambda表达式出现在赋值操作符的右侧,指定了一个空的参数列表,以及当线程运行时写到标准输出的简单的消息输出。

在这里插入图片描述

处理集合
Lambda表达式的出现会被开发人员注意到的首要位置之一就是与集合API相关。假设我们需要将一个字符串列表根据长度排序。

java.util.List l; l= java.util.Arrays.asList (new String[]
{“aaa”, “b”, “cccc”, “DD”});

可以创建一个Lambda表达式实现此功能。

java.util.Collections.sort (l, (s1, s2) ->new
Integer(s1.length()).compareTo(s2.length())

这个示例中包含两个传递给Lambda表达式体的参数,以比较这两个参数的长度。

在这里插入图片描述

除此之外还有许多替代方案,在无需使用标准的“for”或“while”循环的前提下,就可以操作列表中的各个元素。通过向集合的“forEach”方法传入Lambda表达式也可以完成用于比较的语义。这种情况下,只有一个参数传入,也就无需使用括号。

在这里插入图片描述

这个特殊的示例还可以通过使用方法引用将包含类和静态方法分开的方式进一步减少代码量。每个元素都会按顺序传入println方法。

l.forEach(System.out::println)

java.util.stream是在Java 8中新引入的包,以函数式程序开发人员所熟悉的语法处理集合。在包的摘要中对包中的内容解释如下:“为流元素的函数式操作提供支持的类,如对集合的map-reduce转换。”

下方的类图提供了对该包的一个概览,着重介绍了接下来的示例中将要用到的功能。包结构中列示了大量的Builder类。这些类与连贯接口一样,可以将方法链接成为管道式的操作集。
在这里插入图片描述

字符串解析和集合处理虽然简单,在真实世界中仍有许多实际应用场景。在进行自然语言处理(NLP)时,需要将句子分割为单独的词。生物信息学将DNA和RNA表示为有字母组成的碱基,如C,G,A,T或U。在每个问题领域中,字符串对象会被分解,然后针对其各个组成部分进行操作、过滤、计数以及排序等操作。因此,尽管示例中所包含的用例十分简单,其理念仍适用于各类有实际意义的任务。

下方的示例代码解析了一个包含一个句子的字符串对象,并统计单词的数量和感兴趣的字母。包括空白行在内,整个代码清单的行数不超过70行。

  1. import java.util.*;
    2.3. import static java.util.Arrays.asList;
  2. import static java.util.function. Function.identity;
  3. import static java.util. stream.Collectors.*;
    1. public class Main {8. 9.public static void p(String s) {10. System.out.println (s.replaceAll("[\]\[]", “”));11.}
      12.13.private static List uniq(List letters) {14.return new ArrayList (new HashSet(letters));15.}
      16.17.private static List sort(List letters) {18.return letters.stream ().sorted().collect(toList());19.}
      20.21.private staticMap uniqueCount (List letters) {22.return letters.stream() .23. collect(groupingBy(identity (),
      counting()));24.}
      25.26.private static String getWordsLongerThan (int length, List words) {27.return String.join(" | ", words28. .stream().filter(w ->
      w.length() > length)
  4. .collect(toList())30. );
  5. }32.33.private static String getWordLengthsLongerThan (int length, List words)
  6. {35. return String.join(" | “, words36…stream().filter (w -> w.length() > length)
    37…mapToInt(String::length)
    38…mapToObj(n -> String.format (”%" + n + “s”, n))
    39…collect(toList()));
    40.}41.42. public static void main (String[] args) {43.44. String s = “The quick brown fox jumped over the lazy dog.”; 45 String sentence = s.toLowerCase(). replaceAll("[^a-z ]", “”);
    46.47 List words = asList(sentence.split(" "));
  7. List letters = asList(sentence.split(""));
    49.50. p("Sentence : " + sentence); 51 p("Words : " + words.size());
  8. p(“Letters : " + letters.size());
    53.54. p(”\nLetters : " + letters);
  9. p("Sorted : " + sort(letters));
  10. p(“Unique : " + uniq(letters));
    57.58. Map m = uniqueCount(letters); 59 p(”\nCounts");
    60.61. p(“letters”);
  11. p(m.keySet().toString().replace(",", “”));
  12. p(m.values().toString().replace(",", “”));
    64.65. p("\nwords");
  13. p(getWordsLongerThan(3, words));
  14. p(getWordLengthsLongerThan(3, words));
  15. }69. }

示例程序执行输出:

Sentence : the quick brown fox jumped over the lazy dog Words :
9Letters : 44Letters : t, h, e, , q, u, i, c, k, , b, r, o, w, n, ,
f, o, x, , j, u, m, p, e, d, , o, v, e, r, , t, h, e, , l, a, z, y,
, d, o, g Sorted : , , , , , , , , a, b, c, d, d, e, e, e, e, f, g,
h, h, i, j, k, l, m, n, o, o, o, o, p, q, r, r, t, t, u, u, v, w, x,
y, z Unique : , a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r,
t, u, v, w, x, y, z Counts letters a b c d e f g h i j k l m n o p q
r t u v w x y z8 1 1 1 2 4 1 1 2 1 1 1 1 1 1 4 1 1 2 2 2 1 1 1 1
1wordsquick | brown | jumped | over | lazy 5 | 5 | 6 | 4 | 4

上述代码已经经过了多重精简。其中一些方式并非在各个版本的Java中都可行,而且有些方式可能并不符合公认的编码风格指南。思考一下在较早版本的Java中如何才能够获得相同的输出?首先,需要创建许多局部变量用于临时存储数据或作为索引。其次,需要通过许多条件语句和循环告知Java如何处理数据。新的函数式编程方式更加专注于需要什么数据,而并不关心与其相关的临时变量、嵌套循环、索引管理或条件语句的处理。

在某些情况下,采用早期版本中的标准Java语法以减少代码量是以牺牲清晰度为代价的。例如,示例代码第一行的标准import语句中的Java包引用了java.util下的所有类,而不是根据类名分别引用。对System.out.println的调用被替换为对一个名为p的方法的调用,这样在每次方法调用时都可以使用短名称(行9-11)。由于可能违反某些Java的编码规范,这些改变富有争议,不过有着其他背景的程序开发人员查看这些代码时可能并不会有何问题。

另外一些情况下,则利用了从JDK8预览版才新增的功能特性。静态引用(行3-5)可以减少内联所需引用的类的数量。而正则表达式(行10,45)则可以用与函数式编程本身无关的方式,有效隐藏循环和条件语句。这些习语,特别是正则表达式的使用,经常会因为难以阅读和说明而受到质疑。如果运用得当,这些习语可以减少噪音的数量,并且能够限制开发人员需要阅读和说明的代码数量。

最后,示例代码利用了JDK 8中新增的Streaming API。使用了Streaming API中大量的方法对列表进行过滤、分组和处理(行17-40)。尽管在IDE中它们与内附类的关联关系很清晰,不过除非你已经很熟悉这些API,否则这种关系并不是那么显而易见。下表展示了示例代码中所出现的每一次方法调用的来源。
在这里插入图片描述

uniq()(行13)和sort()(行17)方法体现了同名的Unix实用工具的功能。sort引入了对流的第一次调用,首先对流进行排序,然后再将排序后的结果收集到列表中。UniqueCount()(行21)与uniq -c类似,返回一个map对象,其中每个键是一个字符,每个值则是这个字符出现次数的统计。两个“getWords”方法(行26和行33)用于过滤出比给定长度短的单词。getWordLengthsLongerThan()方法调用了一些额外的方法,将结果格式化并转换成不可修改的String对象。

整段代码并未引入任何与Lambda表达式相关的新概念。之前所介绍的语法只适用于Java Stream API特定的使用场景。

总结

用更少的代码实现同样任务的理念与爱因斯坦的理念一致:“必须尽可能地简洁明了,但又不能简单地被简单。”Lambda表达式和新的Stream API因其能够实现扩展性良好的简洁代码而备受关注。它们让程序开发人员可以恰当地将代码简化成最好的表现形式。

函数式编程习语的设计理念就是简短,而且仔细思考一下就会发现许多可以让Java代码更加精简的场景。新的语法虽然有点陌生但并非十分复杂。这些新的功能特性清晰地表明,作为一种语言,Java已经远远超越其最初的目标。它正在用开放的态度接受其他程序设计语言中最出色的一些功能,并将它们整合到Java之中。

喜欢小编轻轻点个关注吧!

重构java代码简洁之道 重构java代码简洁之道,是描述java代码的编写重构的技巧。比较适合中国人 立即下载

相关推荐

松材线虫病害智能检测:基于YOLOv8的无人机航拍数据集构建与模型优化

本文探讨了基于YOLOv8的无人机航拍技术在松材线虫病害智能检测中的应用。通过构建高质量巡检数据集和优化模型架构(如RepVit主干网络和跨尺度特征融合模块),显著提升了病害识别准确率。该方案在复杂森林环境中表现出色,将检测效率提高数倍,为林业病害防控提供了高效解决方案。

vulkan6gpu的博客 995

简洁Java之道

计算机专家在问题求解时非常重视表达式简洁性的价值。Unix的先驱者Ken Thompson曾经说过非常著名的一句话:“丢弃1000行代码的那一天是我最有成效的一天之一。”这对于任何一个需要持续支持和维护的软件项目来说,都是一个当之无愧的目标。早期的Lisp贡献者Paul Graham甚至将语言的简洁性等同为语言的能力。这种对能力的认识让可以编写紧凑、简介的代码成为许多现代软件项目选择语言的首要标准

feilex的专栏 920

信号与系统——卷积、相关运算与FFT关系以及工程应用(三)

卷积运算、相关运算

qq_35028634的博客 6615

如何简单快捷的编写有效的Java程序

*1.掌握使用IDE构建普通的Java项目 IDE:集成开发工具/环境 开发Java的主流IDE : 学会使用使用eclipse编写java程序 1.eclipse 开源 由Eclipse软件基金会(不以盈利为目的)进行维护。 myecliipse 闭源 它是基于开源的Eclipse衍生的 ,天家里更加适合Java EE开发的相关套件。 IEDA 闭源 在目前已经几...

gzcgazc的博客 270

IC617多线程仿真卡死?手把手教你用TigerVNC替换解决ADE XL Explorer问题(附Manjaro/Centos8实测)

本文针对IC617在Manjaro、CentOS 8等高版本Linux系统中运行ADE XL Explorer进行多线程仿真时出现的卡死问题,提供了详细的诊断与解决方案。文章指出问题根源在于软件内置的旧版VNC组件不兼容,并手把手指导用户通过使用TigerVNC替换原组件来彻底解决,附有在Manjaro和CentOS 8系统上的实测步骤与验证方法。

hill8的博客 774

手把手教学:利用AutoDL与vLLM快速部署DeepSeek-R1大模型实战指南

本文详细介绍了如何利用AutoDL平台和vLLM框架快速部署DeepSeek-R1大模型的实战指南。从服务器配置、vLLM安装优化到模型部署的两种方案,再到性能调优和生产环境建议,手把手教你高效完成大模型部署。特别针对国内开发者遇到的网络问题提供了稳定解决方案,并分享了显存优化、磁盘清理等实用技巧。

weixin_42531779的博客 330

java中逻辑与或(&/|)和简洁与或(&&/||)的简单区别

1、& 称为逻辑与,只有两个操作数都是true,结果才是true。       && 称为简洁与或者短路与,也是只有两个操作数都是true,结果才是true。但是如果左边操作数为false,就不计算右边的表达式,直接得出false。类似于短路了右边。 2、| 称为逻辑或,只有两个操作数都是false,结果才是false。       || 称为简洁或或者短路或,也是只有两个操作数都是fals

linzhiyong的专栏 5872

重访时间与覆盖分析的stk操作

1.打开stk 2.创建一个新的场景,命名为Test,选择地球为场景星球,若为金星,可在Central Body里选择Venus(金星自转周期慢,自转周期243天,卫星轨道变化不明显)(其中start stop时间可设置长一些) 3.插入一个AreaTarget或者place,以AreaTarget为例 选择Pattern,Add三个点(用法可见前面的博客,有时候编程的代码也可以帮助理解stk的操作) 4.插入Satellite,选择Orbit Wizard(若想设置卫星的六根数也可

weixin_42664107的博客 1万+

代码整洁之道-关于标识符

title: 代码整洁之道-关于标识符 blog: 博客园 data: Java学习路线及视频 软件中随处可见命名。我们给变量、函数、参数、类和包命名。我们给源代码及源代码所在目录命名。这么多命名要做,不妨做好它。下文列出了取个好名字的几条简单规则。 名副其实,见名知意 变量名太随意,haha、list1、ok、theList 这些都没啥意义 避免误导 包含List、import...

BenCoper的博客 456

PCIE配置和地址空间

来源:https://www.jianshu.com/p/574e9a2cbc4e 每个PCIe设备,有这么一段空间,Host软件可以读取它获得该设备的一些信息,也可以通过它来配置该设备,这段空间就叫做PCIe的配置空间。不同于每个设备的其它空间,PCIe设备的配置空间是协议规定好的,哪个地方放什么内容,都是有定义的。PCI或者PCI-X时代就有配置空间的概念,那时的配置空间如下: 图6.1 整个配置空间就是一系列寄存器的集合,其中Type 0是Endpoint的配置,Type 1是Brid.

qq_28643619的博客 4063

YOLOv8自定义训练:车牌识别全流程(从标注到推理,附可视化代码)

车牌检测全流程实践指南 摘要:本文详细介绍了基于YOLOv8的车牌检测完整实现方案。针对车牌检测中的三大难点(小目标、多角度、光照变化),提供了从数据准备到模型部署的全流程解决方案。重点包括:1)数据采集与标注规范;2)针对小目标的YOLOv8模型优化配置;3)K-means锚框聚类方法;4)训练参数调优策略。通过实际验证,该方法可获得95%以上的检测准确率,并附有完整的代码实现和可视化工具,便于开发者快速复现应用。 (字数:149字)

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 851

Java 8 Stream流:代码简洁之道

想象一下,当你在编写一段复杂的代码时,突然有一种魔法💫可以让你的代码变得简洁又易读。是不是很像科幻小说的情节?😄🎉但是,Java 8的Stream流却能帮你实现这个梦想!✨它就像一位技术大师,悄悄地走进了Java的大门,带来了编程世界的一次革命!💫✨Stream流让我们能够以一种流畅的方式处理集合数据,解决了代码中循环和条件语句的臃肿问题。想象一下,你不再需要写一堆循环来遍历数据,而是可以使用简洁的链式调用来完成各种操作。不禁让人感叹,这简直就是程序员们的福音啊!🚀🌟。

加辣椒了吗?的博客 854

Docker 环境 Playwright MCP 部署全流程指南

Docker部署Playwright MCP全流程指南 本文详细介绍了使用Docker容器化部署Playwright MCP的完整流程,涵盖镜像拉取、容器启动、配置优化和问题排查。主要内容包括: 核心部署步骤:通过官方镜像快速搭建环境,支持自定义端口和数据持久化 关键配置要点:详解网络设置、持久化目录挂载和环境变量配置 服务验证方法:通过日志检查和服务连通性测试确保部署成功 客户端集成:提供VS Code等IDE的配置示例 常见问题解决:针对浏览器启动超时、跨域限制等问题给出解决方案 实战案例:演示自动化爬

勤奋的码农 1474

使用SWIG,在java编程中调用动态库

1. SWIG是什么? SWIG的官方网站是http://www.swig.org/。 官方网站第一句话:SWIG is a software development tool that connects programs written in C and C++ with a variety of high-level programming languages.... ...SWIG is typically used to parse C/C++ interfaces an...

long117long的专栏 1850

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Kotlin: Java 6 废土中的一线希望

去年,Java8 发布了,增加了很多新特性和提升,比如lambda,stream。Java 9 的标准也已经在制定了。但是超过半数的 Android 设备仍在运行着 Java 6,我们要怎么才能用上新的现代化语言呢? 在 DroidCon NYC 2015 的这个分享里,Michael Pardo 介绍了 Kotlin: 由 JetBrains 开发出的 JVM 静态语言。Kotlin 由很

THEONE10211024的专栏 6796

深度学习工具包 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代码,让工作更高效

冗长的Java Java代码冗长之所以名声在外,一部分原因是由于其面向对象的实现风格。在许多语言中,只需要一行包含不超过20个字符的代码就可以实现经典的“Hello World”程序示例。而在Java中,除了需要类定义中所包含的main方法之外,在main方法中还需要包含一个方法调用,通过System.out.println()将字符串打印到终端。即使在使用最少的方法限定词、括号和分号,并且将所...

weixin_30565199的博客 175

Java 25 更简洁、更高效、更现代!

Java 25 LTS版本发布,带来多项现代化改进。核心更新包括:1)语言简化(实例主方法、模块导入等降低入门门槛);2)性能优化(紧凑对象头、分代Shenandoah GC);3)并发增强(结构化并发、作用域值提升线程安全);4)AI支持(向量API加速计算);5)安全性提升(内置PEM编解码)。版本聚焦开发效率、运行性能和现代化特性,使Java更简洁、安全、高效,既降低新手学习成本,又满足企业级应用需求。

jakeswang的博客 1503

Java中的代码简化技巧:让开发更轻松

代码简化工具(语法糖)是一种让代码更直观简洁的写法,功能不变但更易读。它能减少重复、降低错误率。Java中常见的有:自动类型转换(自动处理包装类)、增强型for循环(简化遍历)、泛型(明确集合类型)和可变参数(灵活传参)。这些工具使开发更高效,代码更清晰。

jobleap.cn求职助手首页 383

Java 25 新特性 更简洁、更高效、更现代

Java 25作为长期支持(LTS)版本正式发布,带来多项现代化改进。主要更新包括:基本类型模式匹配简化代码、模块导入减少冗余、轻量级main方法便于入门、Record类增强数据安全、结构化并发优化多线程管理。性能方面推出向量API、紧凑对象头和分代Shenandoah GC,并增强JFR监控能力。安全更新支持现代加密标准,同时移除32位支持专注64位系统。这些改进使Java更简洁、高效且安全,既降低学习门槛又提升专业开发体验。

master_boy的博客 1371

20个Android Studio顶级插件,让你的工作更高效、更智能、更迅速

。

hdhhd的博客 5171

Java开发的未来已来,智能化工具让代码更高效

最新接入DeepSeek-V3模型,点击下载最新版本InsCode AI IDE 标题:Java开发的未来已来,智能化工具让代码更高效 在当今快速发展的技术环境中,Java作为一种经典且强大的编程语言,仍然在企业级应用开发中占据着不可动摇的地位。然而,随着项目复杂度的提升和开发周期的缩短,传统的手工编码方式已经难以满足现代开发者的需求。幸运的是,智能化工具的出现为Java开发带来了全新的可能性,而...

GoldenleafTiger89的博客 787

perses:简化代码的利器

perses:简化代码的利器 在软件开发中,代码的优化与简化一直是提升效率和可维护性的关键环节。今天,我们将为您介绍一个开源项目——perses,这是一款功能强大的语言无关程序简化工具。 项目介绍 perses是一款基于语法的程序简化工具,它能够针对特定的约束条件最小化程序。用户只需提供待简化的程序和一个测试脚本,该脚本定义了需要保留的约束条件。perses会输出一个满足这些约束的最小化程序。与D...

gitblog_00450的博客 716

企业级低代码平台JeecgBoot:让Java开发更高效、更灵活

在数字化浪潮中,低代码开发逐渐从“辅助工具”变成了“生产力标配”。但市面上的低代码平台五花八门,有的像“乐高积木”(拖拉拽生成界面),有的像“AI画图”(生成代码但缺乏灵活性)。,却玩出了新花样——它把“代码生成”和“手工编码”完美融合,号称能帮Java开发者解决80%的重复工作。简单来说,它像一个“代码机器人”,能自动生成前后端代码,但又不完全依赖生成——开发者可以自由修改生成的代码,兼顾效率与灵活性。JeecgBoot的出现,让低代码从“玩具”变成了“生产力工具”。

JakeMa1024的博客 2438

Java开发的智能革命——让编程更轻松、高效

最新接入DeepSeek-V3模型,点击下载最新版本InsCode AI IDE 标题:Java开发的智能革命——让编程更轻松、高效 在当今快速发展的科技时代,Java作为一种广泛应用于企业级应用、Web开发、移动应用和大数据处理等领域的编程语言,依然是开发者们不可或缺的工具。然而,Java开发过程中的复杂性和繁琐性常常让许多初学者望而却步,甚至经验丰富的开发者也会感到力不从心。幸运的是,随着AI...

inscode_091的博客 838

Protobuf:一种更小、更快、更高效的协议

Protobuf介绍 Protobuf (Protocol Buffers) 是谷歌开发的一款无关平台,无关语言,可扩展,轻量级高效的序列化结构的数据格式,用于将自定义数据结构序列化成字节流,和将字节流反序列化为数据结构。所以很适合做数据存储和为不同语言,不同应用之间互相通信的数据交换格式,只要实现相同的协议格式,即后缀为proto文件被编译成不同的语言版本,加入各自的项目中,这样不同的语言可以解析其它语言通过Protobuf序列化的数据。目前官方提供c++,java,go等语言支持。 下面表格是支持语言的

C/C++Linux、音视频、DPDK 2061
上一篇: 如果编程语言是女生,你会爱上谁?
下一篇: 为什么已有Kafka,我们最终却选择了Apache Pulsar?
java1856905
博客等级 码龄8年 100粉丝 249原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值