Java.next:第一部分——共同点

  [color=blue]原文地址[/color]:[url=http://blog.thinkrelevance.com/2008/8/4/java-next-common-ground]Java.next: Common Ground[/url]
  [color=blue]翻  译[/color]:[url=http://eastsun.iteye.com]Eastsun[/url]
  本文是Java.next系列的第一部分。在这一部分,我将探讨作为Java.next的语言所具有的共同特征。
  我选择了四种语言作为“Java.next”的代表:Clojure,Groovy,JRuby,以及Scala。乍看起来,这几种语言有着很大的不同。Clojure是Lisp方言;Groovy是作为“类Java”的选择;JRuby即具有Ruby语言的优雅,同时也有着Rails所带来的优势;与其他都不一样的是Scala,它有着静态语言所具有的特点。
  正如你所料想的一样,有很多关于这些语言中谁才是最好的辩论。之所以有着这么多的辩论,很大程度上是因为这些语言有着很多共同点。它们有着一个共同的演变背景:Java语言。Java语言所具有的优点以及缺陷影响着这些语言的设计方向。
  在这篇文章中,我着重从下面两个方面来阐述这些语言的共同点:

  [color=green]☆ 过去的10年中,我们在基于虚拟机、面向对象的语言编程中得到了很多关于如何开发易读的、可维护的应用。Java.next吸取了这些成果,使得这些语言更注重于问题的本质而不是形式。
  ☆ “本质 VS 形式”的设计理念使得编程方式发生了很大的改变,这种观念的变化比以前从C/C++到Java的转变更大。[/color]

  我将Java.next所具有的共同优点概括为以下八点:
[color=green]  ● 一切皆对象
  ● 简洁的属性定义方式
  ● 易用的集合类
  ● 函数式编程
  ● 运算符重载
  ● 可维护的异常处理
  ● 给已有类增加新方法
  ● 创建新的语言结构[/color]


[color=blue][b][size=medium]一切皆对象[/size][/b][/color]
  在Java中,我们每时每刻都要面对对象类型与基本类型的不同之处。这种不同导致三个实际问题:
  [color=red]1.API必须写两份:一个针对对象类型;一个针对基本类型。更糟糕的情形是需要重写多份:一个针对对象类型,然后对每一个基本类型各写一份。
  2.默认的数值类型有着范围限制,一旦越界,程序会以诡异的形式中断。
  3.对于那些高精度类型(译者注:指BigInteger等类型),你不能使用直观的数学操作符(+,-,etc.)来操作它们。[/color]
  在Java.next中,一切皆是对象。你可以在所有的类型上使用相同的语法调用方法。
; clojure
(. 1 floatValue)
1.0

// groovy
1.floatValue()
===> 1.0

# ruby
1.to_f
=> 1.0

// scala
1.floatValue
res1: Float = 1.0


[color=blue][b][size=medium]简洁的属性定义方式[/size][/b][/color]
  在Java中建立一个属性,你必须定义一个域,一个Getter,一个Setter,以及(通常)一个相应的构造函数,每一个定义都需要适当的访问修饰词。在Java.next中,你可以毕其功于一役。
; clojure
(defstruct person :first-name :last-name)

// groovy
class Person {
def firstName
def lastName
}

# ruby
Person = Struct.new(:first_name, :last_name)

// scala
case class Person(firstName: String, lastName: String)

  如果你需要复写(或删除)一个Getter,Setter或是构造函数,你也可以做到,而无需重写其它部分。
  这还不是全部。所有这些语言信奉TMTOWTDI (There's More Than One Way To Do It),因此这儿不止一种方式可以实现上面同样的要求。


[color=blue][b][size=medium]易用的集合类[/size][/b][/color]
  Java.next针对大部分重要的集合类提供了便利的语法:array与map。此外,你可以通把将函数作为参数将一系列操作连贯起来,而避免使用Java中那种显式的迭代或循环方式。譬如:找出100以内的奇完全平方数:
; clojure
(filter (fn [x] (= 1 (rem x 2))) (map (fn [x] (* x x)) (range 10)))
(1 9 25 49 81)

// groovy
(1..10).collect{ it*it }.findAll { it%2 == 1}
===> [1, 9, 25, 49, 81]

# ruby
(1..10).collect{ |x| x*x }.select{ |x| x%2 == 1}
=> [1, 9, 25, 49, 81]

// scala
(1 to 10).map(x => x*x).filter(x => x%2 == 1)
res20: Seq.Projection[Int] = RangeMF(1, 9, 25, 49, 81)

对哈希表(字典)有着同样便利的操作。

[color=blue][b][size=medium]函数式编程[/size][/b][/color]
  上面集合类的便利使用只是函数式编程的一个特殊情形。Java.next中函数作为一等公民,支持将函数作为参数,将函数作为返回值,以及支持闭包。举一个简单的例子:创建一个函数adder,使得能计算与一个运行时指定的值之和:
; clojure
(defn adder [x] (fn [y] (+ x y)))

// groovy
adder = { add -> { val -> val + add } }

# ruby
def adder(add)
lambda { |x| x + add }
end

// scala
def sum(a: Int)(b: Int) = a + b


[color=blue][b][size=medium]运算符重载[/size][/b][/color]
  在Java中,你不能重载运算符。因此你只能像这样操作BigDecimal:

// Java math
balance.add(balance.multiply(interest));

  Java.next允许你重载运算符。这样你能够创建新的类型并使得它像内建类型一样工作。譬如你能够新建一个ComplexNumber或RationalNumber,使其支持+,-,*,/运算符:

; Clojure
(+ balance (* balance interest))

// Groovy
balance + (balance * interest)

# JRuby
balance + (balance * interest)

// Scala
balance + (balance * interest)


[color=blue][b][size=medium]可维护的异常处理[/size][/b][/color]
  检查型异常(Checked Exception)是一个失败的试验。检查型异常的处理代码使得Java代码变得臃肿并掩盖了问题的关键。更糟糕的是,检查型异常使得代码的维护变得困难。
  Java.next不要求你声明检查型异常,也不要求你显式的处理检查型异常。这表明Java平台的其他语言完全可以避免Java语言中丑陋的检查型异常。

[color=blue][b][size=medium]给已有类增加新方法[/size][/b][/color]
  在Java中,你不能给已有类添加方法。这使得面向对象模型变得很荒谬,开发者需要创建一些工具类,而这是与OO相违背的。

// Java (from the Jakarta Commons)
public class StringUtils {
public static boolean isBlank(String str) {
int strLen;
if (str == null || (strLen = str.length()) == 0) {
return true;
}
for (int i = 0; i < strLen; i++) {
if ((Character.isWhitespace(str.charAt(i)) == false)) {
return false;
}
}
}

  在Java.next中,你能够给已有类增加方法:
[code]
; Clojure
(defmulti blank? class)
(defmethod blank? String [s] (every? #{\space} s))
(defmethod blank? nil [_] true)

// Groovy
String.metaClass.isBlank = {
length() == 0 || every { Character.isWhitespace(it.charAt(0)) }
}

# Ruby (from Rails)
class String
def blank?
empty? || strip.empty?
end
end

// Scala
implicit def strWrapper(s :String) = new {
def isBlank = s.forall{ _.isWhitespace }
}
[/code]

[color=blue][b][size=medium]创建新的语言结构[/size][/b][/color]
  Java包括Java语言以及API库,这两部分是截然不同的:你能够创建新的API库,但你不能够添加新的语言特性。
  而在Java.next中,API库与语言特性没有明显的界线。你能够创建新的语言结构使得它像核心语言特性一样工作。例如,Clojure提供了一个and函数:

; clojure
(and 1 2) => 2

  你需要解决的不一定都是这样二元化的问题。你可能需要一个most函数,当它参数中大部分真时返回true。Clojure中没有这个,但你可以自己动手写一个:

; clojure
(most 1 2) => true
(most 1 2 nil) => true
(most 1 nil nil) => false

  这里的关键之处不是“我的语言是否需要一个most条件?”,而是不同的领域有不同的需求。在Java.next中,语言与库的界限被最小化,你可以添加适当的语言特性以适应你的领域需求,而不是相反。
  再举一个例子,考虑Ruby的attribute语法:

# Ruby
class Account
attr_accessor :name
dsl_attribute :type
end

  attr_accessor是Ruby固有的语法. dsl_attribute是我写的一个库方法,它允许你在做赋值操作的时候省略"=",像下面这样:

# normal attributes
account.name = "foo"

# equals-free attributes
account.type checking


[color=blue][b][size=medium]结论[/size][/b][/color]
  这些Java.next语言有着相当多的共同点。尽管我使用一些孤立的例子来说明这些特点,但只有将它们一起使用时才能体现这些语言的真正威力。综合Java.next的所有特征,会导致一个完全不同的编码方式:

  [color=orange]★ 在编码时你不再需要为了代码的可测试与适应性而采取保守方式:使用类工厂,设计模式以及依赖注入。作为代替,你可以构建一个最小解决方案,并随时改进它。
  ★ 在Java.next中,你可以开发更适合你问题的内部领域特定语言(DSLs)。[/color]

  以我的经验,这种编码方式能将代码量减少一个数量级,同时提高代码的可读性。
  很多人在寻找“next big language”。下一个“big language”已经在这里,但它不是一个单独的语言,而是一组概念的综合体,就如Java.next中表现出来的那样。
  过渡到Java.next配的上"big"这个称号吗?绝对可以。根据我的经验,一旦你作出转变,每一步都有着巨大的进步,包括学习曲线以及生产力。
  在这个系列的后续部分,我将讨论这些语言的不同之处。
保险还在等灾后报案?高精度气象开始提前计算“赔付风险” 【摘要】传统保险理赔模式正在向灾前风险管理转型,保险公司竞争焦点从"赔得快"转向"预判准"。文章提出构建气象保险风险指数(WRI),通过"气象危险度×资产暴露度×标的脆弱性"精准计算损失风险,实现从天气预报向"损失天气"的转变。核心观点包括:1)需关注气象要素的强度、持续时间和空间位置三维度;2)可视化系统应直接显示预期赔付热力图;3)需解决指数保险的基差风险问题,采用多源数据融合技术;4)理想平台需包含风险地图、损失热力图、灾 阅读详情

相关推荐

南京邮电大学《数学实验》模块二(函数的迭代)参考答案

【代码】南京邮电大学《数学实验》模块二(函数的迭代)参考答案。

qq_1293730064的博客 3万+

java .next_Java.next,Java.next语言

存档日期:2019年5月13日 | 上次更新时间:2013年5月14日 | 首次发布:2013年1月29日 本文启动了Neal Ford撰写的新的developerWorks系列文章,该系列文章对三种下一代JVM语言(Groovy,Scala和Clojure)进行了深入的比较。 在这一期的第一部分中,了解通过了解它们的相似之处和不同之处将学到什么 是否选择继续使用Java 现在作为您的...

cusi77914的博客 222

AD9026芯片开发实战指南:从硬件配置到射频校准

本文为AD9026芯片开发实战指南,详细解析了从硬件设计、电源时钟配置、SPI初始化到多芯片同步与JESD204高速链路建立的完整流程。重点探讨了射频校准技术,包括初始化校准与跟踪校准,以保障5G、MIMO等现代通信系统所需的射频性能。旨在帮助开发者系统掌握这颗高性能射频收发器的应用,规避常见设计陷阱。

tomato的博客 853

java中.next()方法的作用及应用?

1、.next()方法的作用:指针指向下一条记录,有记录(有值)返回true并把记录内容存入到对应的对象中,也就是obj.next()的obj中。如果没有返回false。2、.next()方法的应用:一般和ResultSet对象和while循环一起使用,去迭代结果集,并在循环中调用getXXX(intfieldIndex)/getXXX(String columnName)方法获取字段值。过程:R...

墓亦龍的博客 7万+

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

设备卡在等。

摸鱼专家 87

时序预测 | MATLAB实现NGM(1,1)多变量灰色时间序列预测

时序预测 | MATLAB实现NGM(1,1)多变量灰色时间序列预测

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 1517

Java实现的Sequence工具

Java实现的Sequence工具   Sequence是数据库应用中很重要的一个特性,可是有些数据库没有这个特性,比如很流行的开源数据库MySQL就没有Sequence,利用自增主键感觉很不爽,每个表的ID都要设置,通用性也不好。因此考虑为这些不支持Sequence的数据做一个Sequence工具。自动为整个系统提供主键生成策略。   下面是一个Sequence实现,以数据库MySQL为...

weixin_33972649的博客 613

STM32实现简单的智能电子相框

具体的代码案例和详细的代码实现超过5000字,无法在此篇文章中提供。但是,你可以参考STM32的官方文档和相应的图形库和多媒体库的文档,以获得更详细的实现细节和代码示例。对于硬件,我们可以选择使用STM32开发板,如STM32F4 Discovery。对于软件开发环境,我们将使用Keil MDK-ARM作为开发工具,并使用STM32CubeMX进行代码配置。在本文中,我们将使用STM32单片机实现一个简单的智能电子相框,包括显示照片、播放视频和音乐功能。接下来,我们将详细描述实现智能电子相框的步骤。

2401_85625565的博客 1006

java next_java中next()方法是干什么的?

Scanner类是JDK5新添加的一个类,主要作用是处理输入流、文件和文本内容等 。这个类在java.util包里面,实现了Iterator接口,而且io处理采用了jdk1.4才发布的nio。由于这个类实现了Iterator接口,如果全部是string的话,就可以采用next(),hasnext()来进行迭代,就像是迭代一个字符串集合一样。如果处理的内容不是string的话,这个类也提供了next...

weixin_30263409的博客 2775

如何合法抓取TikTok视频信息和评论:完整Python爬虫教程

尽管TikTok没有开放的公共API来直接抓取视频内容和评论,开发者仍然可以通过合法的方式使用第三方API工具来获取公开数据。无论使用什么工具,都应当严格遵守TikTok的使用条款和当地的隐私法规,确保数据抓取行为符合规定。通过本文介绍的TikTok-Api库和Python技术,你可以合法地抓取公开的视频信息和评论,并进行数据存储与分析。使用这些技术时,务必确保抓取行为不会侵犯用户隐私,并遵守平台的API使用规定。

2201_76125261的博客 1710

C++笔记之emplace_back(),push_back()性能比较i++ 、 ++i

操作是否需要临时对象/拷贝性能需要(构造临时对象)较慢不需要(直接构造)较快i++需要(保存旧值)对于内置类型无影响,但对于自定义类型(如迭代器、大对象)会有拷贝开销++i不需要相对更快(尤其是自定义类型)都存在"是否需要额外的临时对象/拷贝"这一性能差异点和++i都是更高效的版本(避免临时对象/拷贝)和i++都可能产生额外的临时对象(前者构造临时对象,后者保存旧值)对于内置类型(如int),i++和++i性能几乎没有差异(编译器会优化);但对于自定义类型(尤其是迭代器等重量级对象),

小勇博客 102

【Java学习笔记】Scanner类中next系列方法的总结

  之前在学习Java的时候在如何通过键盘输入数据方面遇到了一些困难,当时有很多概念不理解,现在我把当时在网上看过的一些文章思路总结一下,其中可能有我个人的一些错误理解,希望大佬们指正,毕竟我还是个菜鸡/(ㄒoㄒ)/~~ ...

小七的博客 2万+

MATLAB基础应用精讲-【数模应用】数字预失真(DPD)(附MATLAB代码实现)

近年来,随着无线通信技术的发展,高功率放大器 (PA) 在提高信号传输功率的同时,也带来了非线性失真问题。PA的非线性失真会造成信号频谱扩展、功率下降、邻道干扰等问题,严重影响系统性能。为了克服PA的非线性失真,数字预失真 (DPD) 技术应运而生。DPD技术通过在发射机中引入一个非线性模块,对信号进行预失真处理,从而补偿PA的非线性失真。

qq_36130719的博客 898

Java中next()、nextLine()以及nextInt()

java键盘录入,Scanner类的方法使用与注意事项

tuoniaoxs的博客 1万+

pscad IEEE标准系统搭建说明

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

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

对Java实现单链表中.next的解释

Q: 问题引入: 我们在用Java实现单链表时, 也许有人会疑惑Java又没有指针,是如何存储链式关系的呢? 又或是有这种疑惑, Java实现中的这种node.next写法是如何移动链表的 A: 首先,Java中虽然没有指针但是有引用啊. Java的眼里,万物皆对象,对象之间靠引用关系联系在一起. 在单链表的实现中, 我们经常会写一个Node类作为内部类供LinkedList(链表类)使用, 其中有一个Node类的变量list用于存储下一个结点的位置(即list持有了到下一个结点的引用). 所

菜菜的大数据开发の路 7923

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Java中next()、nextLine()、以及nextInt()的区别及用法

Java中的Scanner包中的next()、nextLine()、nextInt()都是用来读取输入的方法,但它们之间存在一点细微的区别,这里我们一一举例说明: 首先总结一下:主要区别在于对空格的处理方式不同。 next()方法: import java.util.Scanner; public class test { public static void main(Strin...

lzw17750614592的博客 2777

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【Java基础】Scanner中next与nextLine区别

Scanner概念 scanner可以用来获取用户的输入,八个基本数据类型除字符外都可以输入,另外输入字符串有两种方式next与nextLine。接下来介绍他们的区别。 1.next与nextLine的区别 1.1 区别一 String st1 = scanner.nextLine(); String st2 = scanner.next(); S...

weixin_43287478的博客 4898

JAVA 迭代器 next(),hasNext()初探

目录前言原码解析总结 前言 在使用迭代器的时候,我总是被next(),hasNext()到底指向哪一个元素给迷惑,这次自己读了读原码,总算对相关的知识有了一丁点了解,这次就来分享一下。 原码解析 对于hasNext() public boolean hasNext() { return cursor != size; } 其实现方式是如果游标还没有达到容器的size大小,就返回true,这里与许多人解释的方式不一样, hasNext()不是指有没有下一个元素,

weixin_44062380的博客 6591

java——Scanner中nextLine()方法和next()方法的区别

        遇到一个有意思的东西,在整理字符串这块知识的时候,发现我在用Scanner函数时,在字符串中加入空格,结果空格后面的东西没有输出来(/尴尬),不多说直接上代码: import java.util.Scanner; //Scanner中nextLine()方法和next()方法的区别 public class ScannerString { public static ...

super-yong的博客 9万+

java next语句_java.sql.sqlRecoverableException:Closed语句:next

我的代码抛出java.sql.sqlRecoverableException: Sentencia cerrada: next用英语,我猜它会是:java.sql.sqlRecoverableException: Closed statement: next这是我的代码:public TransactionArray() throws SQLException {/* Obtenemos la t...

weixin_29028611的博客 846

【粉丝福利社】鸿蒙HarmonyOS NEXT开发之路 卷1:ArkTS语言篇

在数字化浪潮的推动下,全球科技领域正经历着前所未有的变革。我国作为这一变革的积极参与者,不仅在多个科技前沿领域取得了显著成就,更在计算机操作系统这一核心技术领域孕育出了具有自主知识产权的创新成果—鸿蒙系统(HarmonyOS)。这一系统开发成功不仅是国人的骄傲,更是全球技术竞争中的一股新兴力量。鸿蒙系统的诞生,标志着我国在全球操作系统领域迈出了坚实的一步。凭借其独特的分布式架构、跨平台能力以及对开发者友好的设计理念,它为智能设备带来了全新的使用体验。

愚公智库 10万+

java中next的用法_关于java iterator的next()方法的用法

UYOUnext()是java迭代器类(Iterator)的方法,获得当前游标指向的下一个元素,详细说明和应用如下:1、迭代器(Iterator)介绍  迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。  Java中的Iterator功能比较简单,并且只能单向移动:  (1) 使用方法ite...

weixin_29791743的博客 5390

sc.next在java什么意思_sc.next() 和 nextLine 的原理

对java的Scanner类的next开头的相关类有点纠结,看了一些博客大致懂了,整理下代码事例直接参考了这位大佬的https://blog.csdn.net/long71751380/article/details/94008351. 总的原理以一段代码为例,scanner类import java.util.Scanner;public class Next {public static voi...

weixin_32899267的博客 5556

Java中.next()和.nextLine()的区别

① nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。 next()会自动消去有效字符前的空格,只返回输入的字符,不能得到带空格的字符串。 package test; import java.util.Scanner; public class SubLoop { public static void main(String[]

Android_DEPON的博客 2万+

Java中Scanner类中next与nextLine的区别

1、next的意思是接受文字(有效文字),next不接收空格回车以及Tab。(当你输入空格回车Tab的时候接收就会终止,并不会存入到String 变量中去)特别的情况:当在输入的时候先输入了几个空格然后再输入String中内容得时候String变量实际接受的是空格后面的内容,并没有接受前面输入的空格,这部分叫做有效输入。 public static void main(String[]args){ Scanner scanner = new Scanner(System.in); System.out.pr

qq_48783543的博客 2681

Java中String的next()和nextLine()方法

目录next()方法nextLine()方法 next()方法 在java中,next()方法是不接收空格的,在接收到有效数据前,所有的空格或者tab键等输入被忽略,若有有效数据,则遇到这些键退出。 String s1 = input.next(); String s2 = input.next(); System.out.println(s1); System.out.println(s2); System.out.println(s1 + s2); //当键盘输入 ABC DEF (注意这一行中有三个空

Running Snail 7002
上一篇: 隐式转换:比动态类型更强大?
下一篇: Java.next:第二部分——与Java互操作
JavaSxy
博客等级 码龄21年 1粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值