从Java到Scala:如何利用IDEA2021快速上手函数式编程(Scala-2.12.15实战)

(超详细)Scala环境搭建(scala-2.12.15、IDEA2021.1.3) Scala环境搭建(scala-2.12.15、IDEA2021.1.3) JunLeon——go big or go home 目录 Scala环境搭建(scala-2.12.15、IDEA2021.1.3) 一、Scala概述 1、什么是Scala? 2、Scala发展史 3、Scala与Java的关系 二、Scala环境搭建 1、环境准备 2、Scala安装与配置环境变量 3、验证Scala 三、编写第一个Scala程序 1、使用IDEA创建maven工程 2、. 阅读详情

从Java到Scala:在IDEA中平滑过渡至函数式编程的实战指南

如果你是一位有经验的Java开发者,第一次打开Scala代码时,可能会感到一种熟悉的陌生感。语法看起来有点像Java,但又处处不同;你熟悉的for循环、getter/setter方法似乎有了更简洁的表达方式,而那个无处不在的=>符号和一堆下划线_又让人摸不着头脑。这种感觉很正常,我当初从Java转向Scala时,也经历了同样的困惑与好奇。但很快我就发现,这种转变并非重学一门语言,更像是解锁了Java的“隐藏技能包”,用一种更强大、更优雅的方式,在熟悉的JVM平台上构建应用。

本文正是为处于这个阶段的你准备的。我们不谈空洞的理论,不罗列枯燥的语法对比表,而是聚焦于如何利用你已有的Java肌肉记忆和IDEA这个强大的IDE,在Scala 2.12.15和IDEA 2021.1.3的环境下,快速上手并写出地道的Scala代码。我们将从一个Java开发者的思维惯性出发,一步步拆解那些看似“怪异”的语法背后的设计哲学,并通过在IDEA中亲手搭建、调试一个混合Java/Scala的实战项目,让你直观地感受到函数式编程带来的思维转变和效率提升。无论你是为了接手Spark大数据项目,还是单纯想提升自己的编程范式,这篇指南都将提供一条清晰、可操作的路径。

1. 思维转换:从命令式到函数式的第一课

对于Java开发者而言,学习Scala最大的障碍往往不是语法,而是思维模式的转换。Java是典型的命令式编程范式,我们习惯于告诉计算机“怎么做”:先初始化变量,再进入循环,在循环体内修改状态,最后返回结果。而Scala深度融合了函数式编程范式,它更倾向于声明“做什么”,将计算过程描述为一系列不可变值的变换。

1.1 重新认识“变量”:val与var的哲学

在Java中,我们声明变量几乎总是用 String str = "hello";。在Scala中,你有了两个选择:val 和 var。

// Scala 代码
val immutableString: String = "Hello, Scala" // 不可变引用
var mutableString: String = "Hello, Java"    // 可变引用
mutableString = "Changed" // 允许重新赋值
// immutableString = "Changed" // 这行会编译错误:Reassignment to val

val 意味着“值”(value),它声明的是一个不可变引用。一旦指向某个对象,就不能再指向其他对象(就像Java里的final变量)。var 意味着“变量”(variable),它可以被重新赋值。Scala社区有一个强烈的约定俗成:优先使用 val。这迫使你从设计之初就思考数据的流动和转换,而不是随时准备修改它。这减少了状态突变带来的副作用,让程序更易于推理和调试。

提示:你可以把Scala中的 val 理解为Java中声明并立即初始化的 final 变量。优先使用 val 是写出函数式风格代码的第一步。

1.2 函数是“一等公民”:从方法到函数

在Java中,我们熟悉的是“方法”(Method),它必须定义在类或接口中。在Scala中,“函数”(Function)可以独立存在,像普通值一样被赋值、传递和返回。

看看如何定义一个函数:

// 定义一个函数,接收两个Int参数,返回它们的和
val add: (Int, Int) => Int = (x, y) => x + y

// 使用函数
val result = add(5, 3) // result: Int = 8

// 函数可以作为参数传递
def operateOnNumbers(a: Int, b: Int, operation: (Int, Int) => Int): Int = {
  operation(a, b)
}

val multiplication = (x: Int, y: Int) => x * y
val product = operateOnNumbers(5, 3, multiplication) // product: Int = 15

这种能力使得高阶函数(以函数为参数或返回值的函数)的使用变得极其自然,它是函数式编程的基石,也是后续学习集合操作(如map, filter, reduce)的关键。

1.3 告别冗长:类型推断与简洁语法

Scala编译器非常智能,在很多地方可以自动推断出类型,这让你可以写出比Java简洁得多的代码。

Java 写法Scala 等价写法 (利用类型推断)说明
String message = "Hello";val message = "Hello"编译器知道"Hello"是String
Map<String, Integer> scores = new HashMap<>();val scores = Map("Alice" -> 95, "Bob" -> 80)编译器推断出Map[String, Int]
public int add(int a, int b) { return a + b; }def add(a: Int, b: Int) = a + b返回值类型Int被自动推断

注意最后一行定义方法的例子:当方法体是单个表达式时,可以省略花括号{};当返回值类型显而易见时,可以省略: ReturnType。这种简洁性让代码更聚焦于逻辑本身。

2. 环境搭建与IDEA配置:无缝衔接Java生态

理论需要实践来巩固。让我们在IDEA 2021.1.3中,搭建一个能同时支持Java和Scala 2.12.15开发的环境。之所以选择2.12.15这个版本,是因为它在生产环境中非常稳定,且与大量现有Java库(包括Spark的某些版本)兼容性良好。

2.1 一站式环境准备

与原始教程中先独立安装Scala再配置IDEA不同,对于现代Java开发者,更推荐使用构建工具统一管理依赖,这样能保证团队环境一致,也省去手动配置的麻烦。我们将使用Maven(你肯定很熟悉)来管理项目。

  1. 创建Maven项目:在IDEA中,File -> New -> Project,选择Maven,使用你的JDK(推荐JDK 8或11,与Scala 2.12兼容性最佳)。
  2. 关键:在pom.xml中添加Scala支持。无需单独下载Scala安装包,Maven插件会帮你搞定一切。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>java-scala-mixed</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <scala.version>2.12.15</scala.version>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <!-- Scala语言库 -->
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>${scala.version}</version>
        </dependency>
    </dependencies>

    <build>
        <sourceDirectory>src/main/scala</sourceDirectory>
        <testSourceDirectory>src/test/scala</testSourceDirectory>
        <plugins>
            <!-- 用于编译Scala代码的Maven插件 -->
            <plugin>
                <groupId>net.alchim31.maven</groupId>
                <artifactId>scala-maven-plugin</artifactId>
                <version>4.8.1</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>testCompile</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <scalaVersion>${scala.version}</scalaVersion>
                </configuration>
            </plugin>
            <!-- 确保Java代码也被编译 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.11.0</version>
                <executions>
                    <execution>
                        <phase>compile</phase>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

这个pom.xml文件做了几件关键事:

  • 定义了Scala版本。
  • 添加了scala-library依赖。
  • 配置了scala-maven-plugin来编译Scala代码,并指定了源码目录为src/main/scala。
  • 保留了maven-compiler-plugin来编译Java代码。
  1. 安装IDEA Scala插件:IDEA会检测到项目中的Scala依赖,并提示你安装Scala插件。点击提示安装即可,或者手动到 File -> Settings -> Plugins 中搜索“Scala”安装。这是必须的,它提供了语法高亮、代码补全、重构等功能。

2.2 验证与第一个混合文件

配置完成后,在src/main下创建两个目录:java和scala。IDEA会自动识别它们。

  1. 创建一个Java工具类 (src/main/java/com/example/JavaUtils.java):
package com.example;

public class JavaUtils {
    public static String greetFromJava(String name) {
        return "Hello from Java, " + name + "!";
    }
}
  1. 创建一个Scala主程序 (src/main/scala/com/example/Main.scala):
package com.example

object Main {
  def main(args: Array[String]): Unit = {
    // 调用Java类
    val javaGreeting = JavaUtils.greetFromJava("Scala Developer")
    println(javaGreeting)

    // 使用Scala函数
    val numbers = List(1, 2, 3, 4, 5)
    val doubled = numbers.map(_ * 2) // 使用下划线占位符,等价于 x => x * 2
    println(s"Doubled numbers: $doubled")

    // 演示val和函数
    val adder: (Int, Int) => Int = (a, b) => a + b
    println(s"3 + 7 = ${adder(3, 7)}")
  }
}
  1. 右键运行Main。你应该会在控制台看到输出,这证明你的混合环境工作正常,并且Scala可以无缝调用Java代码。

注意:第一次编译Scala项目可能会稍慢,因为需要下载相关依赖和编译器。Maven插件的方式避免了手动管理环境变量,使得项目结构更清晰,也便于CI/CD集成。

3. IDEA高效开发技巧:加速你的Scala学习曲线

工欲善其事,必先利其器。IDEA的Scala插件提供了许多强大功能,能极大缓解学习新语法的不适感。

3.1 利用“类型信息”和“转换为Lambda”

作为Java开发者,你可能会对Scala中省略的类型声明感到不安。IDEA可以帮你随时查看。

  • 显示表达式类型:将光标放在任何变量或表达式上,按 Ctrl+Shift+P (Windows/Linux) 或 Cmd+Shift+P (Mac),IDEA会显示它的推断类型。这是理解编译器工作的绝佳方式。
  • 自动补全与类型感知:Scala插件的补全非常智能。当你输入 List(1,2,3).map( 时,补全提示会显示需要一个 Int => B 的函数。这本身就是一种学习。
  • “Convert to Lambda”重构:如果你写了一个匿名函数 (x: Int) => x * x,IDEA可能会建议你简化为 Math.pow(_, 2) 或根据上下文进一步简化。反之,它也能将冗长的函数定义转换为简洁的lambda表达式。多尝试使用 Alt+Enter 查看可用的意图操作。

3.2 交互式探索:Scala Worksheet

这是IDEA中学习Scala的“神器”,相当于一个REPL(读取-求值-打印-循环)环境,但集成在IDE中,可以保存且支持代码补全。

  1. 右键点击你的源码目录 (src/main/scala) -> New -> Scala Worksheet。
  2. 给它起个名字,比如 Exploration.worksheet。
  3. 在打开的Worksheet中,你可以逐行编写Scala代码,每行结尾用 Ctrl+Enter 执行,结果会直接显示在右侧。例如:
// 在Worksheet中尝试
val greeting = "Hello, Worksheet"
println(greeting)

val list = (1 to 5).toList
list.map(_ * 3).filter(_ > 10) // 右侧会立即显示结果:List(12, 15)

// 测试Java互操作
import com.example.JavaUtils
JavaUtils.greetFromJava("Worksheet User")

Worksheet是试验小段代码、理解API、验证想法的完美场所,无需创建和运行完整的对象。

3.3 调试混合代码

调试是开发中的重要环节。IDEA完美支持混合Java/Scala项目的调试。

  • 设置断点:无论是在.java文件还是.scala文件中,单击行号旁设置断点。
  • 启动调试:像调试普通Java应用一样,右键选择Debug 'Main'。
  • 步进与查看:当程序在断点处暂停时,你可以步进(Step Into/Over)到Scala方法或Java方法中。在变量查看窗口(Variables),你可以观察val和var的值,查看复杂的集合类型(如List、Map)的内部结构。
  • 关键点:调试器能清晰地展示Scala语法糖背后的实际执行流程。例如,调试一个for推导式(for-comprehension)时,你可以看到它如何被编译成map、flatMap和filter的调用链。

4. 实战:构建一个简单的混合编程项目

现在,让我们运用所学,构建一个稍微复杂一点的项目,模拟一个简单的数据处理流程。假设我们有一个Java遗留类负责从文件读取数据,而我们想用Scala编写更优雅的数据转换和聚合逻辑。

4.1 项目结构与Java数据源

项目结构如下:

src/main/java/com/example/legacy/
    DataReader.java  // 模拟遗留Java代码
src/main/scala/com/example/core/
    DataProcessor.scala // 核心Scala处理逻辑
    MainApp.scala      // 应用入口

DataReader.java (Java侧 - 模拟不可更改的遗留代码):

package com.example.legacy;

import java.util.Arrays;
import java.util.List;

public class DataReader {
    // 模拟从某个源读取字符串数据
    public static List<String> readRawData() {
        // 假设每行是"姓名,分数"
        return Arrays.asList(
            "Alice,95",
            "Bob,87",
            "Charlie,92",
            "Diana,76",
            "Alice,88"
        );
    }
}

4.2 Scala数据处理逻辑

DataProcessor.scala (Scala侧 - 体现函数式优势):

package com.example.core

import scala.util.Try

case class StudentScore(name: String, score: Int) // 样例类,用于建模数据

object DataProcessor {

  // 解析一行字符串,返回Option[StudentScore],处理可能的格式错误
  private def parseLine(line: String): Option[StudentScore] = {
    val parts = line.split(",")
    if (parts.length == 2) {
      // Try用于安全地将字符串转换为Int,避免NumberFormatException
      Try(parts(1).trim.toInt).toOption.map { score =>
        StudentScore(parts(0).trim, score)
      }
    } else {
      None // 格式不正确,忽略此行
    }
  }

  // 核心处理函数:计算每个学生的平均分
  def calculateAverageScores(rawData: List[String]): Map[String, Double] = {
    rawData
      .map(parseLine)          // List[String] => List[Option[StudentScore]]
      .flatten                 // 过滤掉None,得到List[StudentScore]
      .groupBy(_.name)         // Map[String, List[StudentScore]] 按姓名分组
      .map { case (name, scores) =>
        val avg = scores.map(_.score).sum.toDouble / scores.length
        (name, avg)
      }
  }

  // 另一个函数:找出高于阈值的学生
  def filterTopStudents(scores: Map[String, Double], threshold: Double): List[String] = {
    scores.collect {
      case (name, avgScore) if avgScore >= threshold => name
    }.toList.sorted
  }
}

这段代码展示了多个函数式编程概念:

  • 不可变数据:使用val和不可变集合List、Map。
  • 高阶函数与链式调用:map、flatten、groupBy、collect等操作串联。
  • Option类型:优雅处理可能缺失的值,避免null。
  • 模式匹配:在collect和map的匿名函数中使用case语句。
  • 样例类(Case Class):用于创建不可变的数据模型,自动提供equals、hashCode、toString等方法。

4.3 主程序整合

MainApp.scala:

package com.example.core

import com.example.legacy.DataReader

object MainApp {
  def main(args: Array[String]): Unit = {
    println("=== 开始处理数据 ===")

    // 1. 从Java遗留代码获取数据
    import scala.collection.JavaConverters._
    val rawData: List[String] = DataReader.readRawData().asScala.toList
    println(s"读取到原始数据: $rawData")

    // 2. 使用Scala函数式逻辑处理
    val averageScores = DataProcessor.calculateAverageScores(rawData)
    println("\n学生平均分:")
    averageScores.foreach { case (name, avg) =>
      println(f"  $name: $avg%.2f")
    }

    // 3. 应用更多业务逻辑
    val topStudents = DataProcessor.filterTopStudents(averageScores, threshold = 90.0)
    println(s"\n平均分90分以上的学生: ${topStudents.mkString(", ")}")

    // 4. 演示一些Scala集合的便捷操作
    val allScores = rawData.flatMap(DataProcessor.parseLine).map(_.score)
    val (maxScore, minScore) = (allScores.max, allScores.min)
    println(s"全场最高分: $maxScore, 最低分: $minScore")
  }
}

运行MainApp,你将看到完整的处理结果。这个项目虽然小,但完整演示了:

  • Java与Scala代码在同一个项目中并存与互调。
  • 利用Scala强大的集合API和函数式风格,用更简洁、声明式的代码表达复杂的数据转换逻辑。
  • 如何在IDEA中顺畅地开发和调试这样的混合项目。

从Java到Scala的旅程,始于环境搭建,成于思维转变,精于工具善用。我自己的经验是,不要试图一次性掌握Scala的所有特性(比如隐式转换和高级类型系统),那会让人望而生畏。最好的方法是:从你熟悉的Java项目入手,尝试用Scala重写其中一个工具类或服务层;多使用IDEA的Worksheet进行片段实验;在阅读Scala开源库代码时,重点关注他们如何使用map、flatMap、filter和模式匹配这些核心构造块。你会发现,很多在Java中需要大量模板代码才能实现的操作,在Scala中往往一两行就能优雅地表达。这种效率的提升和代码美感的获得,正是学习Scala最直接的回报。记住,Scala不是要取代Java,而是为你提供了一个在JVM上更强大的工具箱,让你在合适的场景下,写出更健壮、更易维护的代码。

IDEA2021.1.3下Scala-2.12.15环境搭建避坑指南(附常见错误解决方案) 本文详细指导如何在IDEA 2021.1.3中搭建Scala 2.12.15开发环境,并提供了关键的避坑指南。内容涵盖JDK版本兼容性选择、Scala插件安装与版本匹配、以及通过Maven或SBT创建项目的实战步骤,并针对常见的编译与运行时错误提供了深度解析和解决方案,旨在帮助开发者高效构建稳定的开发环境。 阅读详情

相关推荐

(超详细)Scala开发环境配置指南(scala-2.12.15、IDEA2021.1.3)

本文详细介绍了如何在IDEA2021.1.3中配置scala-2.12.15开发环境,包括Java环境准备、Scala安装、IDEA配置、插件安装及第一个Scala项目的创建与运行。通过逐步指导,帮助开发者快速搭建高效的Scala开发环境,并解决常见问题。

weixin_42546392的博客 197

从Java到Scala:如何利用IDEA 2021.1.3快速上手Scala 2.12.15开发

本文为Java开发者提供了利用IntelliJ IDEA 2021.1.3快速上手Scala 2.12.15的实战指南。内容涵盖从环境搭建、插件安装、Maven项目创建,到核心语法差异与函数式编程思维的转换,并通过一个日志处理器的实战案例,帮助开发者平滑过渡,高效开启Scala开发之旅。

weixin_28323057的博客 246

Scala快速入门:从Java到函数式编程的实战指南

函数式编程是一种编程范式,它强调使用纯函数和不可变数据来构建软件系统,其核心原理是通过数学函数式的组合与变换来处理数据,避免状态变化和副作用。这种范式在并发编程和大数据处理领域展现出巨大技术价值,能够显著提升代码的可维护性、安全性和并行处理能力。在应用场景上,函数式编程特别适合构建高并发服务、数据流水线处理以及复杂业务逻辑的建模。Scala作为一门运行在JVM上的多范式编程语言,巧妙地将面向对象与函数式编程融合,为Java开发者提供了平滑过渡到函数式世界的路径。通过其简洁的语法、强大的类型推断和丰富的集合操

weixin_32075843的博客 248

从Java开发者视角:5分钟快速上手Scala-2.12.15环境配置(IDEA2021.1.3版)

本文为Java开发者提供了在IDEA2021.1.3中快速配置Scala-2.12.15环境的详细指南。从JDK版本选择、Scala安装到IDEA插件配置,逐步讲解如何实现Java与Scala的无缝协作,帮助开发者5分钟内完成环境搭建并运行首个混合语言程序。

study的专栏 739

【人工智能工程】完结JEV 决策大模型实战,让 AI 从会聊天到能决策

内容概要:本文介绍了JEV决策大模型的核心理念与工程实践,强调将其作为“快判断”层从通用大模型中剥离使用。JEV不生成文本,而是针对明确的状态和问题,输出结构化、带概率的决策结果,适用于高频、原子化的判断任务。文章详细阐述了JEV的工作机制、与通用大模型的本质区别、典型应用场景(如Agent工具路由)、questions的设计方法、能力边界以及兜底机制的重要性,并指出其在成本、延迟和输出确定性方面的优势。; 适合人群:具备一定AI工程实践经验的研发人员、系统架构师,尤其是正在构建Agent、自动化决策系统或优化大模型调用链的技术团队;; 使用场景及目标:①优化高频、轻量级判断任务(如工单分类、内容初筛、RAG相关性判定)的效率与成本;②实现主模型与决策模块的职责分离,提升系统整体稳定性与可维护性;③学习如何设计高质量的判断问题与概率校准机制; 阅读建议:此资源聚焦于决策模型的工程化落地,建议结合实际业务中的判断流程进行POC验证,重点关注questions设计、阈值校准与兜底策略的构建,避免盲目神化JEV的能力。

从‘裸纤’到成品:手把手拆解光纤阵列(FA)的装配、点胶与端面研磨全流程

本文详细拆解了光纤阵列(FA)从裸纤到成品的全流程,包括装配、点胶与端面研磨等关键工艺。通过实战经验和数据对比,揭示了5G基站、数据中心等场景中FA的精密制造要点与常见故障解决方案,为光通信器件生产提供专业指导。

weixin_42652674的博客 751

IDEA的Scala环境搭建

第一个问题肯定是,scala是什么Scala是一门以Java虚拟机(JVM)为运行环境并将面向对象和函数式编程的最佳特性结合在一起的 静态类型编程语言(静态语言需要提前编译的如:Java、c、c++等,动态语言如:js)。Scala是一门多范式的编程语言,Scala支持面向对象和函数式编程。(多范式,就是多种编程方 法的意思。有面向过程、面向对象、泛型、函数式四种程序设计方法。

2301_78038072的博客 5594

ExpressLRS 915MHz vs 2.4GHz:实测对比与TX12遥控器的最佳搭配方案

本文深入对比了ExpressLRS 915MHz与2.4GHz两种频段在穿透能力、延迟、抗干扰等方面的实测表现,并结合RadioMaster TX12遥控器的硬件特性,提供了从微型花飞到极限远航等不同场景下的最佳搭配方案与EdgeTX系统配置指南,帮助FPV玩家根据核心飞行需求做出精准选择。

milk8的博客 447

IDEA 2021.1.3 + Scala 2.12.15 环境搭建避坑指南(附常见错误解决方案)

本文详细指导如何在IDEA 2021.1.3中搭建Scala 2.12.15开发环境,并解决常见兼容性问题。内容涵盖JDK、Scala安装验证、IDEA插件离线安装、Maven项目配置以及深度排错方案,帮助开发者高效完成环境搭建。

moss5的博客 664

Pixel 6 Pro升级Android 13变砖急救指南:Fastboot全分区修复实战

本文提供Pixel 6 Pro升级Android 13变砖后的Fastboot全分区修复实战指南,详细解析变砖原因、必备工具准备、Fastboot模式解锁、全分区擦除操作及手动刷入官方ROM的完整流程,帮助用户高效解决设备变砖问题。

weixin_28693447的博客 485

Python离线断网情况下安装numpy、pandas和matplotlib等常用第三方包

联网情况下在命令终端CMD中输入“pip install numpy”即可自动安装,pandas和matplotlib同理一样方法进行自动安装。 工作的电脑不能上外网,所以不能通过直接输入pip命令来安装。 环境:电脑上已经安装了Python(没有安装的请参考其他教程)。 Python离线断网情况下安装numpy、pandas和matplotlib等常用第三方包的步骤如下: ...

dayou7738的博客 4944

如何在macOS上快速配置Scala开发环境:函数式编程终极指南

Scala作为一种强大的函数式编程语言,在数据处理、后端开发等领域有着广泛应用。本指南将为macOS用户提供最简单高效的Scala开发环境搭建方案,帮助你快速进入函数式编程的世界。无论你是编程新手还是有经验的开发者,都能通过以下步骤轻松完成配置。 ## 📋 准备工作:安装Java环境 Scala运行依赖Java环境,我们推荐使用SDKMAN!(Software Development Kit

gitblog_00946的博客 951

告别理论劝退:用动画和Tanner图轻松理解QC-LDPC的译码原理(BP算法详解)

本文通过动画和Tanner图直观解析QC-LDPC码的BP译码原理,帮助读者轻松理解802.11ac协议中的编译码过程。文章详细展示了QC-LDPC的结构之美、BP算法的动态信息流动以及LLR的视觉化解读,并对比了硬判决算法的性能差异,为开发者和研究者提供了实用的可视化工具开发建议。

weixin_30411239的博客 493

从Java到Scala:IDEA2021.1.3环境下的无缝过渡实战教程

本文详细介绍了如何在IDEA2021.1.3环境下从Java过渡到Scala,包括Scala-2.12.15的环境搭建、项目配置和代码互操作实践。通过实际案例对比Java与Scala的语法差异,帮助开发者快速掌握函数式编程思维,提升开发效率。

weixin_30879169的博客 310

5、卡尔ibration中Denavit - Hartenberg与Hayati约定的转换

本文详细介绍了机器人运动学中Denavit-Hartenberg(DH)参数与Hayati参数的定义、适用场景及其相互转换方法。重点分析了两种参数在描述关节坐标系变换时的差异,特别是在处理平行或接近平行关节轴时的稳定性问题,并给出了从DH到Hayati及反向转换的具体数学公式与流程图。通过参数转换,可在不改变运动学模型的前提下提升建模精度与计算鲁棒性,适用于机器人标定与运动学分析等应用场景。

h0i1j2k3l的博客 121

北斗导航 | 卫星/惯导组合导航方法

从组合导航结构方面来讲,卫星/惯导(下文以GPS/INS)组合模式一般分为三种,即松组合、紧组合和超紧组合(即深组合)。

尘世冰封的专栏 1539

Scala语言基础详解,并在IDEA中安装Scala插件

Scala起源 Scala是一门多范式的编程语言,一种类似java的编程语言,设计初衷是实现可伸缩的语言、并集成面向对象编程和函数式编程的各种特性。 Scala语言的特点: Scala是面向对象的:Scala是一个纯面向对象语言,在某种意义上来讲所有数值都是对象。对象的类型和行为是由class和trait来描述的。Class的抽象可由子类化和一种灵活的基于mixin的组合机制(它可作为多重继承的简单替代方案)来扩展。 Scala是函数式的: Scala还是一个函数式语言,在某种意义上来讲所有函数都是数值。S

zp17834994071的博客 2211

Camera2Demo

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

Scala安装教程(windows和linux)

Scala安装教程 1. 背景 作为一门编程语言,scala本身和java有很深渊源,而且基于java做了更多扩展,并且scala一些语法特性是作为很多现代化编程语言的参考目标。如函数式编程、完全的面向对象语法设计等等 官网 https://www.scala-lang.org/ scala最新版本,2.13.0 本文将使用的版本2.12.12 https://www.scala-lang.org/download/2.12.12.html 2. windows安装步骤 下载win

xiaohu21的博客 6606

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

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

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

IDEA上使用Scala编程方法

一、获取IDEA 很简单直接在官网上下载:https://www.jetbrains.com/idea/,大家可以下载社区版,学生可以认证获取正版,也可自行破解。 下载完按照步骤一步一步来就可安装成功。 二、获取Scala的JDK 这个也是直接去官网上下载:https://www.scala-lang.org/ 选择第二个msi已经编译好的文件,但是不知道为啥我的电脑只能装2.11版本的,大家可自行选择版本。 下载完双击程序一步一步来就可完成JDK的安装。 三、配置JDK环...

master_hunter的博客 1万+

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

Scala介绍与环境搭建

Scala是一门以Java虚拟机(JVM)为运行环境并将面向对象和函数式编程的最佳特性结合在一起的 静态类型编程语言Scala 源自JavaScala 建立在JVM之上Scala 与java 兼容、互通Scala的优势多范式编程:面向对象的编程、函数式编程表达能力强,代码精简大数据与ScalaSpark采用Scala语言设计提供的Api更加优雅基于JVM的语言更融入Hadoop生态圈面向对象的特性每个值都是对象对象的数据类型和行为有类(Class) 和特征(Trait。

2301_79349971的博客 1219

【Scala】Scala 部署和安装

文章目录一、Scala 简介二、安装三、配置 IDEA直接下载插件自主下载插件引入(推荐) 一、Scala 简介 Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。 Scala 运行在Java虚拟机上,并兼容现有的Java程序。 Scala 源代码被编译成Java字节码,所以它可以运行于JVM之上,并可以调用现有的Java类库。...

beautiful_huang的博客 3338

idea安装scala

idea安装scala

水w的博客 1万+

Scala的安装和IDEA的使用(初入茅庐)

Scala的安装和IDEA的使用(初入茅庐)

m0_57781407的博客 4828
上一篇: Uniapp支付实战:从沙箱到生产环境的避坑与优化指南
下一篇: Word 兼容模式下公式编辑失效的排查与修复指南
code8
博客等级 码龄17年 65粉丝 1720原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值