仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 665|回复: 10
打印 上一主题 下一主题

[学习教程] JAVA网页编程之浅析Java 8的聚合操纵仓酷云

[复制链接]
深爱那片海 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:15:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
你说是sun公司对她研究的透还是微软?针对自己工具开发的.net网页编程性能上肯定会站上风的。Oracle在2014年3月19日准期公布了Java8。Java8版本被以为是具有里程碑意义的一个版本,Oracle在该版本中增加了很多新特征,包含Lambda表达式、办法援用、增强了平安等等。
在浩瀚的新特征中,聚合操纵(AggregateOperations)是针对汇合类的一个对照年夜的变更。经由过程聚合操纵,开辟者能够更简单地利用Lambda表达式,而且更便利地完成对汇合的查找、遍历、过滤和罕见盘算等。
聚合操纵与Java8中的Lambda表达式、办法援用等新特征是相干的,一样平常一同组合利用,但这里只申明聚合操纵的利用,上面就聚合操纵的利用举行复杂申明。
汇合类的条理布局

汇合类是Java言语供应的帮助类,是一种较为通用的数据布局,如Map、Set、List等。Java中汇合类条理干系以下:


如上图,Collection是次要汇合类的接口,其子接口(具化接口)有Deque、Queue、Set、List等。
Map是另外一品种型的汇合,以Key、Value的键值对存储数据集。
在Java8中,在java.util.Collection接口中增加了以下办法:
  1. Stream<E>stream(){returnStreamSupport.stream(spliterator(),false);}
复制代码
stream()办法的可见性润色符为default,这又是Java8的新特征。在接口中(Collection为interface),本不必要(也不克不及)举行办法完成,但引进default润色后就分歧了。开辟者不仅能够举行办法的完成,并且还不必思索向后兼容的成绩。关于DefaultMethod的具体注释,读者能够参考Java8的官方文档。
恰是stream办法引出了汇合类的聚合操纵。
[注重]
Map接口中并没有stream()办法,可是Map的values()和keySet()均前往汇合对象,在汇合对象受骗然是可使用stream()办法的。
聚合操纵实例

为申明聚合操纵的利用,起首界说一个数据元素类Person,以下:
  1. importjava.time.LocalDate;publicclassPerson{Stringname;LocalDatebirthday;Sexgender;StringemailAddress;publicintgetAge(){returnLocalDate.now().getYear()-birthday.getYear();}publicvoidsetBirthday(LocalDatebirthday){this.birthday=birthday;}publicvoidsetGender(Sexsex){this.gender=sex;}publicvoidprintPerson(){System.out.println("Thenameis"+name);}publicSexgetGender(){returngender;}publicenumSex{MALE,FEMALE}}
复制代码
在Java8之前的版本中,对Person汇合的遍历常常接纳以下体例:
  1. Set<Person>persons=newHashSet<Person>();//传统遍历体例for(Personperson:persons){if(person.getAge()>18){System.out.println(person.name+"iselderthan18.");}}
复制代码
一样的功效,在Java8中利用聚合操纵,能够完成以下:
  1. //利用聚合操纵persons.stream().filter(newPredicate<Person>(){@Overridepublicbooleantest(Personperson){if(person.getAge()>18){returntrue;}else{returnfalse;}}}).forEach(newConsumer<Person>(){@Overridepublicvoidaccept(Personperson){System.out.println(person.name+"iselderthan18.");}});
复制代码
起首,在汇合对象persons上挪用stream()办法(聚合操纵),获得person对象的数据集(elements),然后挪用聚合操纵filter()对汇合中的元素举行过滤,再挪用forEach()完成对切合前提的person的打印。
Predicate和Consumer为Java8中界说的函数接口(FunctionalInterface),在java.util.function包上面,函数接口也是Java8的新特征。在上述代码中,利用了两个匿名类分离对Predicate和Consumer举行了完成,这两个接口都只要一个办法,这也是函数接口的特性之一。
上述代码中的写法仍是对照烦琐的,为进一步简化,可使用Lambda表达式完成,以下:
  1. //利用聚合操纵及Lambdapersons.stream().filter(p->p.getAge()>=18).forEach(p->System.out.println(p.name+"iselderthan18."));
复制代码
由于filter()、forEach()的参数均为函数接口,以是能够交换为Lambda表达式的体例。复杂来了解,Lambda表达式就是同意开辟者将代码逻辑作为参数举行传送,关于Lambda表达式的具体内容,请参Java8的官方文档。
聚合操纵的利用

聚合操纵是Java8针对汇合类,使编程更加便当的体例,能够与Lambda表达式一同利用,到达加倍简便的目标。
后面例子中,对聚合操纵的利用能够回结为3个部分:

  • 数据源部分:经由过程stream()办法,获得汇合对象的数据集。
  • 经由过程一系列两头(Intermediate)办法,对数据集举行过滤、检索等数据集的再次处置。如上例中,利用filter()办法来对数据集举行过滤。
  • 经由过程终极(terminal)办法完成对数据会合元素的处置。如上例中,利用forEach()完成对过滤后元素的打印。
两头办法除filter()外,另有distinct()、sorted()、map()等等,其通常为对数据集的收拾(过滤、排序、婚配、抽取等等),前往值一样平常也是数据集。
终极办法常常是完成对数据会合数据的处置,如forEach(),另有allMatch()、anyMatch()、findAny()、findFirst(),数值盘算类的办法有sum、max、min、average等等。终极办法也能够是对汇合的处置,如reduce()、collect()等等。reduce()办法的处置体例通常为每次都发生新的数据集,而collect()办法是在原数据集的基本长进行更新,过程当中不发生新的数据集。
从下面的例子中能够看出,经由过程stream()办法,从汇合对象猎取的数据集与汇合对象的迭代器(Iterator)有些相似,但他们也不完整不异:

其实产生见解的过程就是训练自己发现问题,分析问题的能力。根据以上的认识我想谈下传统的学习与通过视频独立学习的优缺点:
再现理想 该用户已被删除
沙发
发表于 2015-1-20 18:52:05 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
板凳
发表于 2015-1-25 20:54:38 来自手机 | 只看该作者
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
小女巫 该用户已被删除
地板
发表于 2015-2-3 23:38:41 | 只看该作者
如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
不帅 该用户已被删除
5#
发表于 2015-2-6 14:09:13 | 只看该作者
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
深爱那片海 该用户已被删除
6#
 楼主| 发表于 2015-2-8 20:59:15 | 只看该作者
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
只想知道 该用户已被删除
7#
发表于 2015-2-9 21:12:52 | 只看该作者
还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
再见西城 该用户已被删除
8#
发表于 2015-2-12 00:52:56 | 只看该作者
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
蒙在股里 该用户已被删除
9#
发表于 2015-2-26 09:16:08 | 只看该作者
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
山那边是海 该用户已被删除
10#
发表于 2015-3-7 00:53:25 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
冷月葬花魂 该用户已被删除
11#
发表于 2015-3-13 06:07:08 | 只看该作者
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-10 09:10

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表