【Java函数式编程进阶】:从Lambda基础到Stream高级应用全打通

第一章:Java函数式编程概述

Java 函数式编程是 Java 8 引入的重要范式革新,它通过引入 Lambda 表达式、方法引用和函数式接口等特性,使开发者能够以更简洁、声明式的方式编写代码。这一编程模型强调不可变数据和无副作用的计算,提升了代码的可读性和并发处理能力。

核心特性

  • Lambda 表达式:允许将行为作为参数传递,简化匿名内部类的冗长写法
  • 函数式接口:仅包含一个抽象方法的接口,可通过 @FunctionalInterface 注解标识
  • 方法引用:通过 :: 符号直接引用已有方法,提升代码可读性
  • Stream API:提供链式调用方式处理集合数据,支持过滤、映射、归约等操作

示例:Lambda 与函数式接口使用

// 定义函数式接口
@FunctionalInterface
interface Calculator {
    int compute(int a, int b);
}

// 使用 Lambda 实现接口
Calculator add = (x, y) -> x + y;
Calculator multiply = (x, y) -> x * y;

// 调用方法
System.out.println(add.compute(5, 3));     // 输出: 8
System.out.println(multiply.compute(5, 3)); // 输出: 15

上述代码中,compute 方法通过 Lambda 表达式实现加法与乘法逻辑,避免了传统匿名类的模板代码,使逻辑内联化、表达更直观。

常见函数式接口对比

接口名所在包抽象方法用途
Function<T,R>java.util.functionR apply(T t)接收 T 类型参数,返回 R 类型结果
Consumer<T>java.util.functionvoid accept(T t)消费输入参数,不返回结果
Predicate<T>java.util.functionboolean test(T t)判断条件是否满足

第二章:Lambda表达式核心语法与原理

2.1 Lambda表达式的基本结构与语法糖解析

Lambda表达式是Java 8引入的重要特性,其基本结构由参数列表、箭头符号和方法体组成:
(parameters) -> expression
或包含多行语句的块:
(String s) -> {
    System.out.println(s);
    return s.length();
}
其中,参数类型可省略,编译器通过上下文推断类型,如 (s) -> s.length() 等价于上述写法。
语法糖的深层含义
Lambda本质上是函数式接口的实例,仅含一个抽象方法的接口(如 Runnable、Consumer)可被Lambda实现。编译器在底层将其转换为 invokedynamic 指令,提升调用效率。
  • 无参数示例:() -> System.out.println("Hello")
  • 单参数简化:s -> s.toUpperCase()
  • 异常处理:抛出异常需与函数式接口声明一致

2.2 函数式接口与SAM类型的深入理解

在Java和Kotlin等语言中,函数式接口(Functional Interface)指仅包含一个抽象方法的接口,是Lambda表达式应用的基础。这类接口通过@FunctionalInterface注解显式声明,编译器将确保其符合SAM(Single Abstract Method)规范。
SAM转换机制
在Kotlin中,若Java接口仅有一个抽象方法,编译器会自动将其函数类型参数映射为Lambda表达式,实现SAM转换。例如:
val runnable: Runnable = Runnable { println("Hello SAM") }
// 可简写为
val runnable2: Runnable = { println("Hello SAM") }
上述代码中,Runnable是典型的SAM接口,其run()方法被Lambda替代,提升了代码简洁性。
函数式接口对比表
接口抽象方法用途
Runnablerun()线程执行任务
Callablecall()返回结果并抛异常
Comparatorcompare()对象比较逻辑

2.3 方法引用与构造器引用的实践应用

在Java函数式编程中,方法引用和构造器引用能显著简化Lambda表达式的写法,提升代码可读性。通过特定语法,可以直接引用已有方法或构造函数。
方法引用的四种形式
  • 静态方法引用:ClassName::staticMethod
  • 实例方法引用:instance::method
  • 对象类型的方法引用:Class::method
  • 构造器引用:ClassName::new
List names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(System.out::println); // 静态方法引用
上述代码中,System.out::println 等价于 s -> System.out.println(s),更简洁直观。
构造器引用的实际应用
Supplier<ArrayList<String>> listCreator = ArrayList::new;
ArrayList<String> newList = listCreator.get();
此处使用构造器引用创建集合实例,适用于工厂模式或对象构建场景,减少样板代码。

2.4 变量捕获与闭包特性在Lambda中的体现

变量捕获的基本机制
Lambda表达式能够访问其外部作用域中定义的局部变量,这一特性称为“变量捕获”。被捕获的变量必须是有效最终(effectively final)的,即未被重新赋值。
int factor = 2;
Runnable task = () -> {
    System.out.println("Factor: " + factor); // 捕获外部变量
};
task.run();
上述代码中,factor虽未显式声明为final,但在Lambda中使用时已不可更改,满足有效最终条件。JVM通过生成内部类并复制变量值实现捕获。
闭包的形成与生命周期
当Lambda持有对外部变量的引用并延长其生命周期时,便形成了闭包。这允许函数对象在后续调用中持续访问原始上下文数据。
  • 捕获的变量被隐式封装进Lambda实例中
  • 支持跨作用域的状态保持
  • 可能引发内存驻留问题,需谨慎管理生命周期

2.5 Lambda底层实现机制:invokedynamic与字节码分析

Java中的Lambda表达式并非简单的语法糖,其底层依赖于`invokedynamic`指令实现高效的动态调用。该机制自Java 7引入,并在Java 8中被用于Lambda的延迟绑定。
invokedynamic的工作原理
`invokedynamic`通过调用“引导方法”(Bootstrap Method)解析调用点,延迟至运行时确定具体实现。这使得Lambda可以按需生成函数式接口实例。
字节码示例分析
Runnable r = () -> System.out.println("Hello");
编译后,上述代码不会生成匿名内部类,而是使用`invokedynamic`指向`LambdaMetafactory.metafactory`引导方法,动态生成实现类。
  • 引导方法创建CallSite,决定目标方法句柄
  • JVM缓存调用点,提升后续调用性能
  • Lambda实例的类名形如`Lambda$123`,由JVM动态命名

第三章:Stream API基础构建与操作

3.1 创建Stream的多种方式及其源码剖析

在Java 8中,Stream是函数式编程的核心组件之一,提供了强大的数据处理能力。创建Stream的方式多样,每种方式背后都有其特定的应用场景和实现逻辑。
从集合创建Stream
最常见的方式是通过集合的stream()方法:
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
该方法调用Collection.stream()接口,默认实现为Collection.spliterator()封装成流,底层依赖于Spliterator进行元素分割与遍历控制。
数组与静态工厂方法
使用Stream.of()可直接传入可变参数:
Stream<Integer> stream = Stream.of(1, 2, 3);
其源码内部调用Arrays.stream()将参数转为数组后封装为流,适用于已知元素的快速构建。
  • Collection.stream():基于集合迭代器
  • Stream.of(T...):支持可变参数输入
  • Stream.iterate():生成无限序列

3.2 中间操作链的惰性求值机制详解

惰性求值是函数式编程中的核心优化策略,中间操作如过滤、映射等不会立即执行,仅构建操作链,直到终端操作触发求值。
惰性求值的优势
  • 避免不必要的计算,提升性能
  • 支持无限数据流处理
  • 减少中间集合的内存占用
代码示例与分析
stream := data.
    Filter(func(x int) bool { return x % 2 == 0 }).
    Map(func(x int) int { return x * 2 })
result := stream.Collect() // 此时才触发执行
上述代码中,Filter 和 Map 仅为链式结构添加操作节点,不进行实际遍历。只有当 Collect() 被调用时,数据才会流经整个操作链,逐元素完成判断与转换,实现高效的一次性计算。

3.3 终端操作的分类与执行流程分析

终端操作可划分为交互式命令执行、批处理任务运行和远程会话管理三大类。每类操作在底层均通过shell解析命令并调用系统API完成。
操作类型对比
类型特点典型场景
交互式命令实时输入输出,用户驱动文件浏览、进程查看
批处理任务脚本驱动,非交互定时备份、日志清理
远程会话基于SSH等协议加密通信服务器远程维护
执行流程示例
#!/bin/bash
read -p "Enter command: " cmd
eval "$cmd" 2>/dev/null || echo "Execution failed"
该脚本模拟终端命令执行:首先读取用户输入,通过eval动态执行,错误重定向至空设备并捕获异常,体现命令解析→执行→反馈的标准流程。

第四章:Stream高级操作与性能优化

4.1 聚合操作reduce与collect的灵活运用

在函数式编程中,reduce 和 collect 是处理集合数据的核心聚合操作。它们能够将流式数据转换为单一结果或结构化集合。
reduce 操作详解
List numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream().reduce(0, (a, b) -> a + b);
该代码通过 reduce 将列表元素累加。初始值为 0,每次迭代将前一次结果与当前元素相加,最终返回总和。适用于生成单一值的场景。
collect 的高级用法
  • Collectors.toList():收集为 List
  • Collectors.groupingBy():按条件分组
  • Collectors.mapping():映射后收集
例如,可将用户列表按年龄分组:
Map
此操作构建层级结构,提升数据组织能力。

4.2 分组、分区与多级统计的实际案例解析

在大数据处理场景中,分组(Grouping)、分区(Partitioning)和多级统计是提升查询性能与数据组织效率的核心手段。通过合理设计数据结构,可显著降低计算资源消耗。
电商订单的多维分析场景
以电商平台为例,需按地区、时间、品类进行销售统计。采用分区策略将数据按天划分,提升查询效率:
-- 按日期分区,按城市分组
SELECT 
  city,
  SUM(sales) AS total_sales
FROM orders 
WHERE order_date = '2023-10-01'
GROUP BY city;
该查询仅扫描指定分区数据,避免全表扫描。分区字段 order_date 作为目录层级,加速文件定位。
多级统计聚合结构
使用分组嵌套实现省市销售额汇总:
省份城市销售额
广东深圳120万
广东广州98万
浙江杭州85万

4.3 并行流的工作原理与线程安全问题探讨

并行流基于Fork/Join框架实现,将数据源拆分为多个子任务并行处理,最终合并结果。其核心在于ForkJoinPool的使用,利用工作窃取算法提升CPU利用率。

并行流的执行流程
  • 数据分割:将原始流按一定策略切分为多个子流
  • 任务分发:每个子流提交至ForkJoinPool中的线程执行
  • 结果归并:各线程结果通过累加器或归约操作合并
线程安全风险示例
List<Integer> result = new ArrayList<>();
IntStream.range(0, 1000).parallel().forEach(result::add); // 非线程安全

上述代码在多线程环境下可能导致ConcurrentModificationException或数据丢失,因ArrayList非同步容器。

安全替代方案
场景推荐方案
集合收集使用Collectors.toList()
共享变量采用AtomicInteger等原子类

4.4 Stream性能调优策略与常见陷阱规避

合理选择中间操作与终端操作
Stream 的性能优化始于操作链的设计。避免在中间操作中执行高开销计算,如频繁的装箱/拆箱或冗余映射。

List<Integer> result = list.parallelStream()
    .filter(x -> x > 10)
    .mapToInt(x -> x * 2)        // 使用 mapToInt 避免 Integer 装箱
    .limit(100)
    .boxed()
    .collect(Collectors.toList());

上述代码通过 mapToInt 减少对象创建,提升吞吐量;limit 提前截断数据流,降低后续处理量。

规避常见性能陷阱
  • 避免在 parallelStream 中使用线程不安全集合
  • 慎用 sorted() 和 distinct(),它们为有状态操作,成本较高
  • 优先使用 forEachOrdered 替代 forEach 保证顺序性,减少同步开销

第五章:函数式编程在实际项目中的应用与趋势

响应式数据流处理
在现代前端架构中,函数式编程与响应式编程深度结合。以 RxJS 为例,通过高阶函数操作 Observable 流,实现异步事件的声明式处理。以下代码展示了如何使用 map 和 filter 对用户输入进行防抖和合法性校验:

import { fromEvent } from 'rxjs';
import { debounceTime, map, filter } from 'rxjs/operators';

const input = document.getElementById('search');
fromEvent(input, 'input')
  .pipe(
    debounceTime(300),
    map(event => event.target.value.trim()),
    filter(query => query.length > 2)
  )
  .subscribe(query => fetchSuggestions(query));
不可变状态管理
React + Redux 架构广泛采用不可变数据更新模式。通过纯函数 reducer 管理状态变迁,提升调试可预测性。以下是使用 Immer 简化不可变更新的示例:

import produce from 'immer';

const initialState = { users: [], loading: false };

const userReducer = (state = initialState, action) =>
  produce(state, draft => {
    switch (action.type) {
      case 'FETCH_USERS_SUCCESS':
        draft.users = action.payload;
        draft.loading = false;
        break;
    }
  });
函数式在后端服务中的实践
Go 语言虽非纯函数式语言,但可通过高阶函数实现中间件链。如下是 HTTP 日志中间件的函数式组合:
  • 定义通用 HandlerFunc 类型:func(http.ResponseWriter, *http.Request)
  • 中间件返回包装后的 HandlerFunc
  • 通过 compose 模式串联多个行为
模式优势典型场景
纯函数校验无副作用,易于测试表单验证、权限判断
柯里化配置提升函数复用性API 客户端构造
Java8 函数式编程 Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来对 Java 集合运算和表达的高阶抽象。Stream API 可以极大提高 Java 程序员的生产力,让程序员写出高效率、干净、简洁的代码。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 变换,聚合等。 阅读详情

相关推荐

函数式编程-Stream流

能够看懂公司里的代码大数量下处理集合效率高代码可读性高消灭嵌套地狱。

qq_39239712的博客 1623

Java 函数式编程、Lambda表达式、Stream流

Java函数式编程的相关知识,包括Lambda表达式、Stream流等

愿你永远安康 愿你永远懂得飞翔 1540

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表达式实现函数式接口

哎 你看的博客 1195

Java函数式编程

Java函数式编程 初探函数式编程【JavaScript篇】哔哩哔哩bilibili 三更草堂Up主。不会Lambda表达式、函数式编程?你确定能看懂公司代码?-java8函数式编程(Lambda表达式,Optional,Stream流)从入门到精通-最通俗易懂_哔哩哔哩_bilibili 项目地址:bearbrick0/FuncProgram: 👀Java函数式编程的demo (github.com) 什么是函数式编程 为什么要学习函数式编程

- 7129

Java 框架体系读懂函数式接口、Lambda表达式、Stream

• 函数式接口是 Java 8 引入的一种接口,它只包含一个抽象方法。函数式接口的存在是为了支持 Lambda 表达式,使得我们可以使用更简洁、更灵活的方式编写匿名函数。• @FunctionalInterface 注解是可选的,推荐使用。该注解会让编译器强制检查接口是否满足函数式接口定义。• 首先定义一个函数接口,函数作用是对传入的元素进行操作,最后返回操作后的元素。复制// 自定义函数接口1.2.3.4.5.• 自定义的 MyStream 类来使用自定义的函数接口。复制。

wjianwei666的专栏 1139

光电式烟雾传感器实战指南(一) 光迷宫设计与散射原理篇

本文深入解析了光电式烟雾传感器的核心部件——光迷宫的设计原理与光散射机制。文章详细阐述了如何通过精心设计的光学结构实现‘透气不透光’,并重点探讨了前向散射(尤其是135°角)在提升烟雾监测系统灵敏度与可靠性中的关键作用,为DIY爱好者提供了从理论到实践的完整指南。

weixin_29229055的博客 586

Java8函数式编程(Lambda表达式,Stream流,Optional)

lambda表达式是Java8的一个新特性,从本质上来讲是一个匿名函数可以使用这个匿名函数实现接口中的方法,并且非常简洁。通常来讲,使用 lambda表达式 是为了。关于接口实现,可以有很多种方式来实现。例如L设计接口的实现类、使用匿名内部类。但是lambda表达式比这两种方式都简单。

qq_62767608的博客 4064

EV1527、PT2262傻傻分不清?一文讲透常见315/433MHz遥控编码协议区别与选型

本文深度对比了EV1527、PT2262和SC5262三种常见的315/433MHz遥控编码协议,详细解析了它们的技术特点、成本效益和适用场景。EV1527作为低成本方案的首选,特别适合智能家居和简易安防设备;PT2262在稳定性和兼容性上表现优异;而SC5262则在安全性方面具有显著优势。文章还提供了实用的选型框架和工程建议,帮助开发者在不同应用场景中做出最优决策。

weixin_33640562的博客 349

Java函数式编程入门

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

zjh285077371的专栏 1779

MT4/MT5数据源接入全攻略:从买服务、自研API到低成本DDE,哪种方案适合你?

本文全面解析MT4/MT5数据源接入的三种主流方案:商业服务、自研API和低成本DDE,详细对比其技术参数、成本结构和适用场景。帮助技术团队根据业务需求选择最优方案,确保外汇交易系统的数据流稳定性和实时性,提升交易体验和业务连续性。

weixin_42568801的博客 172

从频谱分析到硬件加速:用ZYNQ-7020+FFT IP核实现实时信号处理的完整方案

本文详细介绍了如何利用ZYNQ-7020和FFT IP核实现实时信号处理的完整方案,涵盖系统架构设计、硬件加速实现及性能优化。通过异构计算架构,该方案将1024点FFT处理延迟压缩至28μs,显著提升工业自动化和无线通信等领域的实时频谱分析效率。

weixin_33704234的博客 467

函数式编程笔记(Stream、方法引用、Lambda)

一文了解函数式编程

m0_73639126的博客 1498

手把手教你学 Simulink (1.3)--Simulink 的模块库及其模块介绍

Simulink 提供了丰富的模块库,涵盖了从基本的信号生成和处理到复杂的数学运算和系统建模的各种功能。通过熟悉这些模块库及其模块,你可以更高效地构建和仿真动态系统。

MHD0815的博客 5150

Java8常用特性:Lambda、Stream流、方法引用、函数式接口

文章目录1、函数式接口2、Lambda表达式3、方法引用4、Stream流5、Optional类 1、函数式接口 定义:只包含一个抽象方法的接口,称为函数式接口 常见的函数式接口举例: 我们可以在一个接口上使用 @FunctionalInterface 注解,这样做可以检 查它是否是一个函数式接口。比如我们创建一个接口,里面定义两个抽象方法后家上注解,但是这样会发现编译就会报错,因为它并不是函数式接口 2、Lambda表达式 表达式语法: Lambda 表达式:在Java 8 语言中引入的一种新的语法元

保持学习 4132

YOLO26涨点改进 | 独家创新、损失函数改进篇 | TGRS 2025顶刊 | 带来AIoU小目标涨点损失函数,增强了目标检测中对边界框形状和尺寸的敏感度,适合复杂场景和小物体检测中有效涨点

AIoU损失函数通过自适应形状感知和尺寸敏感加权机制,有效解决了YOLO26原生损失函数在小目标检测中的缺陷。实验结果表明,AIoU损失函数在多个数据集上均取得了显著的性能提升,尤其在小目标检测和多任务场景下表现突出。自适应形状感知,对形状差异较大的目标给予更大惩罚,提高边界框拟合精度尺寸敏感加权,对小目标的宽高比例差异给予更大权重,增强模型对小目标特征的学习能力梯度连续性好,即使在IoU=0时仍能提供有效的梯度更新,解决小目标梯度消失问题。

qq_36130719的博客 159

北斗导航 | 从北一到北二再到北三,你应该知道的北斗导航系统

博主github:https://github.com/MichaelBeechan 博主优快云:https://blog.youkuaiyun.com/u011344545 一、引言 我国高度重视北斗系统的建设和发展。自20世纪80年代开始探索适合我们国家国情的卫星导航系统发展道路,形成了“三步走”的发展战略:2000年底,建成北斗一号导航系统,向我国广大用户提供服务;2012年底,建成北斗二号导航系统,...

尘世冰封的专栏 3079

Java函数式编程指南:从Lambda入门到Stream精通

它不是要你抛弃面向对象,而是为你提供了一套更强大的工具,来处理程序中的“数据”和“行为”。拥抱它,你的代码世界将焕然一新。它提供了一套声明式的API,可以让你像搭建流水线一样,对集合(Collection)数据进行复杂的查询、过滤、转换、聚合等操作。代码从6行缩减到1行,可读性大大提升,意图也更加明显:“用字符串的。Java通过它来为Lambda表达式提供一个明确的类型。想象一下,你想让一位厨师为你做一道“番茄炒蛋”。: 当你拿到一个集合,想要对它进行处理时,,像一个整数、一个字符串一样,

m0_52710583的博客 614

YOLOv11改进 | Conv改进篇 | 含2种改进,引入DynamicConv替换普通Conv卷积下采样和C3k2_DynamicConv替换C3k2(来自CVPR2024)

本文提出了一种基于DynamicConv动态卷积优化的YOLOv11轻量化模型改进方案。通过引入多专家机制的动态卷积模块,在增加模型参数量的同时保持较低的计算复杂度(FLOPs),有效解决了低FLOPs模型在大规模预训练中的性能瓶颈问题。文章详细介绍了动态卷积的工作原理、核心代码实现,并提供了在YOLOv11中集成DynamicConv和C3k2_GhostModule_DynamicConv模块的完整教程,包括模块添加、配置文件修改和模型训练验证过程。实验结果表明,该方案在保持高效推理速度的同时显著提升了

Ai缝合怪、助力小伙伴高效发论文 537

Java8新特性:从 Lambda 到 Stream:掌握 Java 函数式编程

Java 8 引入的 Lambda 表达式与 Stream API 已成为现代 Java 开发的标准工具。本文从函数式编程基础讲起,逐步带你掌握 Lambda 的语法、函数式接口的作用,并深入 Stream 的三步流程与实战应用。通过学习本文,你可以写出更简洁、高效、专业的集合操作代码,真正理解“声明式编程”的魅力。 学完后建议对照文末的“自我检测清单”,确认自己是否掌握了核心知识点。

m0_73944572的博客 832

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

efm32 入门.pdf

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

JAVASE进阶:一文精通Stream流+函数式编程

JAVASE进阶:一文精通Stream流+函数式编程

m0_52380556的博客 1854

深度学习工具包 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基础》-- Lambda表达式及Stream的使用

函数式编程是一种编程范式,它将计算过程视为函数应用的连续组合。函数式编程强调使用纯函数(Pure Function),避免使用可变状态和副作用,倡导将计算过程抽象为函数,便于代码的理解、测试和并行化。在JDK8之前主要函数式编程主要体现在匿名内部类的使用上。

lmj3732018的博客 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java 函数式编程深度实战:从 Lambda 到 Stream API 的工程化落地

若内置函数式接口无法满足需求,可自定义函数式接口,需满足 “仅有一个抽象方法” 的规范。java运行// 自定义函数式接口:双参数加法运算(也可使用内置BiFunction)// 内置BiFunction替代自定义接口// 1. 使用自定义函数式接口// 输出:30// 2. 使用内置BiFunction(双参数函数式接口)// 输出:4.0Java 函数式编程并非替代传统命令式编程,而是提供了一种更简洁、更高效的编程范式,尤其适用于集合操作、异步编程、代码复用等场景。核心概念。

m0_72256543的博客 989

编程自学指南:java程序设计开发,Java中函数式编程思想, Java函数式编程演进,Stream API高级应用

编程自学指南:java程序设计开发,Java中函数式编程思想, Java函数式编程演进,Stream API高级应用

zl515035644的博客 1151

Java基础函数式编程

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

孤夜的博客 3051

Java函数式编程与Lambda表达式

C++,Java,C#,Python等各个编程语言早已经支持lambda表达式了,作为即将从业的大学生,现在学习Java的函数式编程应该为时不晚。 FunctionalInterface函数式接口 四个最基本的函数式接口 基本数据类型的函数式接口 1double类型的函数式接口 2int类型的函数式接口 3long类型的函数式接口 4boolean类型的函数式接口 一元函数式接口 用于类...

优快云文章已停止维护,后续文章会在 https://blog.hufeifei.cn 持续更新 7082
上一篇: 线上服务频繁Full GC?深入剖析堆内存泄漏排查全路径
下一篇: 分布式链路追踪落地实践:Spring Cloud Sleuth + Zipkin性能监控全解析
InstrFun
博客等级 码龄1年 142粉丝 1990原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值