学习和使用Scala的Json解析类库-JSON4S
介绍
在Scala
环境下已经至少有6种Json解析的类库很用了很相似的抽象语法树(AST),而JSON4S
这个项目的目标就是提供一个单一的AST树供其他Scala
类库来使用。
JSON4S
的features:
- 快速的
JSON
解析 LINQ
风格的查询- 可以紧密结合样例类
- 差别比较和合并
- 使用
DSL
来生成有效格式的JSON
- 支持
XPATH
- 优雅的打印
- 支持
XML
的转换 - 序列化
在Scala
环境下已经至少有6种Json解析的类库很用了很相似的抽象语法树(AST),而JSON4S
这个项目的目标就是提供一个单一的AST树供其他Scala
类库来使用。
JSON4S
的features:
JSON
解析LINQ
风格的查询DSL
来生成有效格式的JSON
XPATH
XML
的转换
泛型,可以告诉编译器每个集合中接受哪些对象类型,编译器会自动地为你的插入进行转化,并在编译时告知是否插入了类型错误的对象。(貌似Java
里面的泛型都是伪泛型吧-_-|)
什么是原生态类型?
类似List<E>
,Collection<E>
泛型的定义都有一个原生态类型,那就是List
,Collection
,用他们定义类型也不会出错.
为什么不要使用原生态类型
使用原生态类型的集合类可以插入各种不同的类型,他们在编译时不会进行类型检查,但是运行时遇到错误就会抛出,这样是很不安全的。
我在不确定或者不在乎集合类型的情况下,是不是用原生态类型最好?
还是不要用,可以使用无限制的通配符来替代,比如1
2
3
4
5
6
7
8
9
10
11static int numElementsInCommon(Set<?> s1,Set<?> s2)
{
int count=0;
for(Object o:s1)
{
if(s2.contains(o))
count++;
}
return count;
}
它是类型安全的,但是无法猜测放入了哪些对象,此时可以使用泛型或者有限制的通配符类型(下文会描述)。
泡椒牛蛙是一道色香味俱全的汉族名菜,属于川菜系。最常见又易烹制,成菜后味咸鲜,肉细嫩,色红亮,泡菜香气浓郁。
Linux版本:Centos6.5
Mac版本:OS X Yosemite 10.10.2
通过ssh连接到linux,会出现如下警告:
-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
这是由于没有找到对应的语言环境导致的:
按一下命令步骤操作即可修复:
首先
sudo vi /etc/ssh_cofig
然后将该文件中的SendEnv LANG LC_*这一行用#进行注释
#SendEnv LANG LC_*
通过ssh连接到linux,有时候会莫名其妙的出现错误:
Write failed: Broken pipe
看资料说的是由于长时间未操作造成的,解决方法为在Mac端的~/.ssh/config文件中添加:
ServerAliveInterval 60
参考:解决ssh的”Write failed: Broken pipe”问题
以:
和/
开头的命令都有历史纪录,可以首先键入:
或/
然后按上下箭头来选择某个历史命令。
在命令行窗口中输入以下命令即可
vim
直接启动vimvim filename
打开vim并创建名为filename的文件vim file
打开单个文件vim file1 file2 file3 …
同时打开多个文件:open file
在vim窗口中打开一个新文件:split file
在新窗口中打开文件:bn
切换到下一个文件:bp
切换到上一个文件:args
查看当前打开的文件列表,当前正在编辑的文件会用[]括起来。:e ftp://192.168.10.76/abc.txt
:e \qadrive\test\1.txt
Esc
或Ctrl+[
进入) 左下角显示文件名或为空i
键进入) 左下角显示—INSERT—
最近在Haddop
环境下跑论文里的对比试验,不过这两天在跑Job时偶然会出现Job Failed的问题,看日志就是其中一台机器Connect Timeout了,在WebUI上点击这台机器IP的各种UI界面也是开不了,HDFS
还连不上-_-|,之前也遇到过这种问题,解决方法简单粗暴:
Haddop
集群:一般重启一下还正好了Haddop
集群,然后重启每台物理机,然后再开启Hadoop
集群:这么做一般问题就可以解决-_-|Linux
上删除dfs
文件目录,重新初始化HDFS
:这么做效果虽达到了,但是。。。向HDFS
传数据还很久一段时间。。今天第1、2种方法试了都不行,第三种方法也太麻烦了(集群有15台DataNode
+1台NameNode
,重新初始化每次都要去每个机器上删除文件夹再新建),由于时间受限,就想尝试去动态的直接把那个老是异常的节点去掉得了,赶紧查了下面一些资料:
类和接口是Java程序设计语言的核心,它们也是Java语言的基本抽象单元。
尽可能使每个类或者成员不被外界访问。
Java
的4种访问级别:
private
:只有在申明该成员的类的内部才可以访问。package-private
:包内的任何类都可以访问这个成员,(这个是默认的访问级别)protected
:子类可以访问超类的protected
成员,但是还有这个protected
成员类的包内的任何类也可以访问。public
:任何地方都可以访问这个成员。如何方法覆盖了超类中的中的一个方法,子类中的访问级别就不允许低于超类的访问级别。
这样可以确保使用超类的实例的地方也可以使用子类的实例。
实例域是不能公有的。
其实就是建议类里面只暴露final
修饰的变量成员,其他变量一律不要暴露。
长度非零的数组总是可变的。
就算你使用static final
关键字将一个数组成员暴露出来,但是这个数组成员的内容还是可以被外部给修改的。你可以使用
类在继承时,它的所有非final
方法都用明确得通用约定,他们都是被设计为要被覆盖的,对于任何一个类,在覆盖这些方法的时候,都需要遵循这些通用的约定,如果做不到这一点,其他依赖于这些约定的类将无法结合该类一起工作。
我们都知道
equals
方法称被用于判断两个对象是否相等(除地址外),那你知道该方法应该被如何设计呢?
equals
方法需要遵循的约定:
null
的引用值x
,x.equals(x)
必须要true
,也就是自己一定要和自己相等啊。null
的引用值x
和y
,当前仅当y.equals(x)=true
时,x.equals(y)=true
一定成立。null
的引用值x
、y
和z
,如果x.equals(y)=true
、y.equals(z)=true
,则x.equals(z)=true
一定成立,关于这点,写代码时难点主要是在有子类、超类同时存在的情况下比较难搞。。null
的引用值x
和y
,只要equals
的比较操作在对象中所用的信息没有被修改,多次调用x.equals(y)
返回的值一定相等。null
的引用值x
,x.equals(null)
一定为false
,关于这一条,不必要在equals
方法是使用null
的判断。对于这些约束,编写equals
有下面几个诀窍:
由于实验需要在半年前开始接触Scala
,之前也学习/使用过TIOBE榜上Top20中一半左右的编程语言,感觉还是Scala
给我印象最深,最近没怎么做相关的开发感觉都开始慢慢淡忘了,上周在技术分享时我对Scala
作了一些总结,顺便在这里写下。
Scala
注意,本文主要是描述我所了解的Scala
相关的基础语法,和Java
相同得在这里就不再累赘。
Scala是一种基于JVM的编程语言,集成了面向对象和函数式编程的特性,既能处理脚本化得临时任务,又能处理高并发场景下分布式大数据应用。
Java
就是因为有JVM
虚拟机才成就了现在的辉煌,Scala
同样是运行在JVM
,大致可以看做Java的升级版,由于现在大数据大势所趋,各种大数据框架的出现导致了Scala
强势崛起!
编程初学者最先接触的应该就是”Hello,World”,而WordCount可以看做大数据编程的入门必学技能,所以现在我们在”Hello,World”上实现CharCount:1
2
3
4
5
6
7
8
9//Scala Application
val str="Hello,wrold"
val data=str
.split(Array(',',' '))
.flatMap(for(c<-_) yield (c,1)) //好Api
.groupBy(_._1)
.mapValues(_.size)
println(data)