「java脱糖」什么是脱糖
今天给各位分享java脱糖的知识,其中也会对什么是脱糖进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、话说模式匹配 scala里的赋值语句都是模式匹配吗
- 2、为什么java总是吹的很厉害,真正运用起来却被C#各种吊打?
- 3、王垠,40行代码,JAVA吧的大神怎么评论
- 4、Java与.net的优势缺点?
- 5、学习 java语言 需要注意什么啊
- 6、Java简单算法问题
话说模式匹配 scala里的赋值语句都是模式匹配吗
先抛个问题,下面的语句是否都合理(编译通过),哪些会引起模式匹配?
scala val a = 100
scala val A = 100
scala val a@b = 100
scala val (a,b) = (100,200)
scala val (a,B) = (100,200) //第二个变量大写
scala val Array(a,b) = Array(100,200)
scala val Array(a,B) = Array(100,200)
scala object Test { val 2 = 2 }
scala object Test { val 2 = 3 }
我们先看看其他语言(对scala有影响的)有关赋值语句的定义:
1) 在 ML 语言里,对赋值语句的定义:
val P = E
表示定义了模式P中的变量,并赋予它们表达式E中相应的值。
2) 在Erlang中等号 = 表示一个模式匹配操作
在这两种语言中,赋值语句都明确的定义为模式匹配,那么scala中,所有的赋值语句是否都是模式匹配呢?
尤其scala可以说在函数式风格上与ML(及其家族)语言有某种血缘,在这一点上是否也与ML完全一致呢?
先分析一下上面的每条赋值语句:val a = 100 和 val A = 100是直观且没有歧义的。
val a@b = 100 是什么意思?回忆一下第一篇里讲过的“变量绑定模式”,当时的例子有点复杂,重新理解一下:
//给"hello"字符串对象用v1这个变量名
scala "hello" match { case v1 = println(v1) }
//变量绑定模式,把变量v2 绑定在v1这个模式上
scala "hello" match { case v2@v1 = println(v2) }
上面的例子中,第一行中v1是个变量模式。 第二行中v2是一个新的变量,只有在v1这个模式匹配成功的情况下,才会把自己绑定到v1上,而v1因为是一个变量模式,它总能匹配成功,所以这里v2也会绑定到”hello”对象上。变量绑定模式通常不会这么使用,更多用在绑定到一个复合结构的模式上,如:
scala List(1,List(2,3)) match { case List(_, x@List(2,_*)) = println(x.size) }
2
把变量x绑定到了嵌套的 List(2,3) 这个对象上
但赋值语句val a@b = 100 跟上面的有关系么?我们通过ToolBox看看它”脱糖”后的语法树:
scala tb.parse("val a@b=100")
res13: tb.u.Tree =
{
synthetic private[this] val x$3 = 100: @scala.unchecked match {
case (a @ (b @ _)) = scala.Tuple2(a, b) //这一句
};
val a = x$3._1;
val b = x$3._2
}
有注释的那一句里面把a,b两个局部变量绑定到通配符”_”上,而这个通配符模式case _ = 可以匹配任何对象,所以相当于把a,b两个变量绑定到了100这个对象上,并产生了一个二元组记录这两个局部变量值。最终把二元组里的值分别赋给了我们定义的a,b两个变量。
接下来的val (a,b) = (100,200) 这个赋值也容易理解,把二元组里的值分别赋给a,b两个变量么,也是经过模式匹配的么?继续用ToolBox分析:
scala tb.parse("val (a,b)=(100,200)")
res14: tb.u.Tree =
{
synthetic private[this] val x$4 = scala.Tuple2(100, 200): @scala.unchecked match {
case scala.Tuple2((a @ _), (b @ _)) = scala.Tuple2(a, b)
};
val a = x$4._1;
val b = x$4._2
}
看到了,是一个构造器模式与变量绑定模式的混合模式匹配。
再下一个val (a,B) = (100,200) 这个与上一个有区别么?回顾一下第一篇里讲到的“常量模式”:当变量大写时将被对待为常量模式,也就是说 大写B 和上面的 小写b 是两种不同的模式!!
scala tb.parse("val (a,B)=(100,200)")
res15: tb.u.Tree =
val a = scala.Tuple2(100, 200): @scala.unchecked match {
case scala.Tuple2((a @ _), B) = a
}
大写B在这里当作常量来解析,但又找不到B这个变量(除非之前有定义过),就报错了:
scala val (a,B) = (100,200)
console:8: error: not found: value B
val (a,B) = (100,200)
^
后边两个Array的赋值语句与这两个类似,小括号写法只是元组(Tuple)的语法糖而已。
最后,真正有趣,且会让新手崩溃的情况 object Test { val 2 = 2 } 为什么这个编译和初始化都没问题?
scala object Test { val 2 = 2 }
defined module Test
scala Test
res16: Test.type = Test$@3042dc22
简直逆天,难道这个背后也与模式匹配有关系么?
scala tb.parse(" object Test { val 2 = 2 }")
res0: tb.u.Tree =
object Test extends scala.AnyRef {
def init() = {
super.init();
()
};
synthetic private[this] val x$1 = 2: @scala.unchecked match {
case 2 = ()
}
}
确实又是一个常量模式匹配,2匹配2,成功。
同理,下一个 object Test { val 2 = 3 } 也是个常量模式匹配,但为何明显不匹配,却可以编译时成功,而运行时时才报错呢?
scala object Test { val 2 = 3 }
defined module Test
scala Test
scala.MatchError: 3 (of class java.lang.Integer)
at Test$.init(console:8)
这是因为object 是惰性初始化的原因(lazy),如下:
// 对下面的单例
object Test { val a = 2 }
$ scalac -Xprint:jvm A.scala
package empty {
object Test extends Object {
private[this] val a: Int = _;
stable accessor def a(): Int = Test.this.a;
def init(): Test.type = {
Test.super.init();
Test.this.a = 2; //在初始化时才对成员赋值
()
}
}
}
在对多个变量赋值,或变量中有@符合,导致模式匹配还好理解,但”2=2″也引起模式匹配就会让我产生疑问:
是否所有的赋值语句都是模式匹配?
为了验证,通过编译选项查看val a=2 这样对单个变量的赋值却没有看到模式匹配。
另外,如果单个变量也是模式匹配,为何大写字母val A=2没问题?假设对单个变量赋值也是模式匹配,那岂不无法定义大写的变量了;肯定是有区别的,但又怎么区分的?
我最初遇到这个困惑,在邮件列表里问了这个问题,得到了一些回复,并且有人给了一个老帖子链接说早就讨论过val 1=2这个话题了:
在那个帖子里,martin也回复了为何 val 1=2是模式匹配,并且为何不把这种情况作为错误给修复掉:
A value definition is of the form
val pattern = expression // 这个同ML和Erlang语言
1 is a pattern
There is one edge case:
If the pattern is a single variable (upper or lower case or backquoted), then it is always treated as a variable, not a constant. Otherwise, there would be no way to define such a value.
只有一种边缘情况:如果模式是一个单独的变量(大写、小写、或用反引号引起来的),那么它总被当作变量,而非常量。否则就没法定义这样的一个值。
所以1=2, "a"="b" 这样的赋值语句虽然是一个变量,但变量名称不符合上面的约束,产生了模式匹配。至于为何不修复这个问题(直接在编译时报错),也可以从这个帖子的线索中找到原因。
为什么java总是吹的很厉害,真正运用起来却被C#各种吊打?
解决方案 跟项目优秀 是两码事
一个软件核心的是解决方案,企业选择的也是解决方案,当然 java 跟C# 也要看对应的领域
不能用强势的对比弱势的一方 这不公平。
尤其是web方面的社区问题。很多成熟的东西,JAVA直接拿下来用。
而C#却很多没有。你说C#能做吗?当然能做。但是你要知道直接COPY比你自己写是来的多么轻松。
所以这里面有很多因素,比如最直接的就是市场 商业效应。然后滚雪球效应。
比如你去在win上,比如控制器 上位机,那些 C# 就比JAVA多很多,
但是互联网JAVA多很多
原因是 以前java可以到处跨平台,linux免费吧,可以给公司带了很大利益效应吧。尤其是大厂需要定制化的东西。可以自己用手是不是
在客户端因为被标准化了,图形界面统一着 你看C#就多很多。
而国内为什么你看到JAVA多。因为国内出名的公司基本都是互联网,你见过有实体产业的公司吗?基本没有。 因为互联网公司创业成本低的非常可怕,利润高的非常可怕、那么流动的人员也大的可怕,所以你在网上看到的几乎都是互联网的在讨论。
而实体经济 金融 很少有人流动,所以他们几乎讨论声很少。而大多数都是外国成功的解决方案。就更少了
java并没有被吹的多厉害。的确在互联网上个它的社区你必须承认庞大。那么它的语法烂的跟屎一样。为了money还不是一大堆人去继续堆。
c# 哪怕语言设计再好。性能再好。你怎么抗衡社区力量。 你把所有的项目发钱,系统推倒重来吗?不现实的、
所以一门语言它火必定有它的优点。正视语言的优点在那个领域发挥最好才是开发人员所考虑的。
当然我们不排除有些东西是大厂抛的橄榄枝,小厂不好好思考自己的业务,就乱跟风。最后人财两空的也一大把、 这里面有商业占大头。信仰是其次
王垠,40行代码,JAVA吧的大神怎么评论
1.这段 40 多行代码是给 Scheme 程序脱糖的程序,属于解释器的代码,而不是应用代码。对其的客观评价显然只有设计解释器的人才能给出。
2.这代码不是一般人看的,本身他用的语言就是极客向的语言,而且这搞的又是很专业的东西,主要是与解释器相关的领域。CPS的功能是很明确的,但其价值只有对编译器解释器很有研究的人才能判定。
3.以自然语言写作比喻,编写自解释器级别的代码,就像你在写一本小说,而小说的主角也在写一本小说,这位主角在描写你,对你的刻画会影响到你,你受到影响之后又会改变小说中的主角,从而影响到他对你的描写。你俩要相安无事,情节合符逻辑地发展,直到最后圆满的结尾。这比写一本普通小说可难多了。
Java与.net的优势缺点?
java和.net我都做过开发,说下个人感觉(仅为个人观点)。
从框架上说,.net里分.net Webform和.net MVC。我认为这是两个截然不同的东西。
.net MVC和java ssh我感觉差不多。好坏仁者见仁智者见智,我觉得.net MVC更方便一些,并且MVC的框架本身也开源了,也有很多不错的插件。
.net Webform就不一样了(当然现在.net中 Webform开发还是占据大多数),开发速度快,简单易学,好上手,跟开发客户端程序似的,中小型项目中用的挺多。
不过我个人不建议使用.net Webform再开发了,拖控件之类的开发模式对web发展,还是自身发展有害无益。MVC用熟了也不慢(当然上手比较难),实在追求开发速度用ROR更快。
从语言上说,C#和java我感觉也没什么区别。C#新版本有很多lambda,动态类型之类的新语言特性,还有大量的语法糖。
不过java可以跨平台,这点C#无能为力。
从社区上说,java毕竟一直开源,社区感觉还是要比.net更好一些。(ps:不要忽略社区的力量,不过Java自从被Oracle收购后。。。。。不爽啊。)
从就业上说,也差不多,分地区。Java貌似略好。
从面子上说,貌似java开发人员更有优越感~,国内有看不起.net的现象。
以前有种说法,Java适合开发大项目,.net适合中小型项目。这个我也基本赞同。
最终观点,无论是语言还是框架只是一种工具,能完成项目的前提下,哪个成本最低用哪个。程序的设计思想都是一样的。
如果热爱技术的话,Web开发中ror(国外都快没落了,中国都还没火起来)、node.js(这个我感觉比较有前途)等新兴技术最好也能了解了解,虽然就业上可能费劲一些,多数都是外企要这类人才。不过这也是web技术发展的趋势。
纯手打~望采纳!
学习 java语言 需要注意什么啊
作为常年占据编程语言排行榜首位的Java也吸引了很多人前去学习,对于零基础的人来说,Java学习中要注意哪些呢?下面,千锋就给大家介绍一下。初学者在学习Java时,要注意以下事项:
1、明确学习方向
对于零基础学习Java的人来说,一定要有一个明确的学习方向,不能急于求成。很多人为了能快速入门Java,会直接入手项目,这不太实际,有的人不学基础,一看代码觉得Java很难就放弃了。所以我们在学习的时候一定要牢固基础,按阶段的学习,坚持下来才会有提高。
2、制定学习任务
初学者在学习Java时,往往会因为没有计划像无头的苍蝇一样乱撞,学习的内容不系统,最终导致学习效果低下,拖延进度。所以我们在学习的时候要制定好学习计划,按照计划走,从基础到进阶,一步一个脚印,只有这样,你才能学会怎么样解决问题,并加深自己对Java的理解。
3、注重理论实践
学习Java最忌讳的就是纸上谈兵,没有实际项目操作经验,这也是为什么很多人在学习完后迟迟找不到工作的原因。我们学习Java一定要注重理论和实践相结合,在学习中尽可能的积累实战经验,这样才能在学完后与企业需求相接轨,达到用人单位要求。学习Java的过程虽然辛苦,但坚持下来终会带来回报。
在美国、加拿大、澳大利亚、新加坡等发达国家和中等发达国家,Java软件工程师年薪均在4—15万美金,而在国内,Java软件工程师也有极好的工作机会和很高的薪水。一般情况下的Java软件工程师是分四个等级,从软件技术员到助理软件工程师,再到软件工程师,最后成为高级软件工程师。
根据IDC的统计数字,在所有软件开发类人才的需求中,对Java工程师的需求达到全部需求量的60%—70%。同时,Java软件工程师的工资待遇相对较高。
Java简单算法问题
初步做了一个出来,但是效率并不是很高,前100个计算速度还可以,但是往后就很慢了。如果什么时候有空的话可以再看看,先给你代码吧,不知道能不能帮上你
public class AlisandaNumber {
private static final int MAX_INDEX = 1000; // 可以先把这个常量改为1-6,验证正确性
public static void main(String[] args) {
int a = 0;
int index = 0;
while(index MAX_INDEX) {
a += 6; // 每次循环自增6,由题目规律可知A是6的倍数
boolean breakOut = false;
// 最大的约数为此数的平方根,因为如果是两个平方根相乘的话,剩下的就只有1了
int maxNum = (int) Math.ceil(Math.sqrt(a));
p:
for(int p = 1; p = maxNum; p ++) {
if(a % p != 0) {
continue; // 如果不是约数的话,没必要考虑,下同
}
// 最大约数为平方根的相反数,原理同上
maxNum = (int) Math.ceil(Math.sqrt(a / p));
for(int q = -1; q = -maxNum; q --) { // q和r必为负数
if(a % q != 0) {
continue;
}
int r = a / (p * q);
int nonZero = p * q + p * r + q * r;
if (nonZero == 0) {
continue;
}
if((a == p * q * r) (a == (p * q * r) / (nonZero))) {
index ++;
breakOut = true;
break p; // 跳出外层循环
}
}
}
if(breakOut) {
System.out.println(String.format("第%d个压力山大数是%d", index, a));
}
}
}
}
关于java脱糖和什么是脱糖的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-12-23,除非注明,否则均为
原创文章,转载请注明出处。