- 浏览: 1036754 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
繁星水:
Useful!!
Object-C之(Null)与(Bool) -
pacer123:
请问注解@ApiModelProperty 在哪个jar包下面 ...
Micro Service工具集之Swagger:可测试的样式化API文档 -
sucheng2016:
这东东真的好用么/
对象转换利器之Dozer -
zzq0324:
http://git.oschina.net/zzq0324/ ...
基于Spring-WS的Restful API的集成测试 -
lrz0534:
你好,我在maven上面下载了swagger-springmv ...
Micro Service工具集之Swagger:可测试的样式化API文档
前2天听了熊老师的一个Session,关于List Process的,差点忘了总结,现记录如下:
从一个Story开始,现需求如下:(注:List中的每个元素都是都是整数)
(1)、给定一个List,把List中的每个元素+1,返回新的List;
(2)、给定一个List,把List中的每个元素*2,返回新的List;
(3)、给定一个List,取出其中的偶数,返回新的List;
以TDD的思维开发,先写Testcase
第一次大家对addOne,multiplyTwo,getEvenList实现如下
对于List的处理,我们通常可以分为3类
第一类:对List中的每个元素,做同样的处理,得到一个新的集合,即遍历列表,针对每个elment做一元函数Func(x)的映射,因为一一对应,因此可简称为Map操作;
第二类:判断List中的的每个元素是否满足某个条件,对满足条件的元素进行相应的逻辑处理得到新的List。比方说filter,select,reduce等等操作。
第三类:求取集合中所有元素的总值,比方说求和操作,这类操作对于每个元素来说都是一个2元操作,func(init_value,x),即把当前element的值加初始值上。可以简称为Accumulation操作。
在Google的collections包中就根据这样的思想提供了相应的工具类,改造过后的代码
第一:代码更直观,我们关注的只是function,predicate中的内容,也就是我们的核心业务逻辑。
第二:可以分布式处理,因为循环的时候CPU需要记录当前处理的元素下标之类的信号量,整个循环的处理过程会绑定在一个CPU上处理,就只能发挥一个CPU的计算能力,多核时代多浪费。如果使用Google的这种方式,就可以把一个很大的List拆分成一个个小的任务,然后并发执行之后再合并回来,也就是Map-Reduce的思想。
最后,熊老师推荐了一本经典书籍<Structure and Interpretation of Computer Programs>(计算机程序的构造和解释),说是看完之后,编程基本功会大大提高。刚加入清单,还没开始读,等读完之后再来写篇读后感。
补:关于为什么不把Filter的功能做到Lists类的原因参见:http://code.google.com/p/guava-libraries/wiki/IdeaGraveyard
从一个Story开始,现需求如下:(注:List中的每个元素都是都是整数)
(1)、给定一个List,把List中的每个元素+1,返回新的List;
(2)、给定一个List,把List中的每个元素*2,返回新的List;
(3)、给定一个List,取出其中的偶数,返回新的List;
以TDD的思维开发,先写Testcase
public class ListProcessTest { @Test public void test_every_element_in_list_add_one() throws Exception { List<Integer> inputList = Arrays.asList(1, 2, 3, 4); assertThat(ListProcess.addOne(inputList), is(Arrays.asList(2, 3, 4, 5))); } @Test public void test_every_element_in_list_multiply_two() throws Exception { List<Integer> inputList = Arrays.asList(1, 2, 3, 4); assertThat(ListProcess.multiplyTwo(inputList), is(Arrays.asList(2, 4, 6, 8))); } @Test public void test_get_even_from_input_list() throws Exception { List<Integer> inputList = Arrays.asList(1, 2, 3, 4); assertThat(ListProcess.getEvenList(inputList), is(Arrays.asList(2, 4))); } }
第一次大家对addOne,multiplyTwo,getEvenList实现如下
public class ListProcess { public static List<Integer> addOne(List<Integer> inputList) { List<Integer> result = new ArrayList<Integer>(); for (int input : inputList) { result.add(input + 1); } return result; } public static List<Integer> multiplyTwo(List<Integer> inputList) { List<Integer> result = new ArrayList<Integer>(); for (int input : inputList) { result.add(input * 2); } return result; } public static List<Integer> getEvenList(List<Integer> inputList) { List<Integer> result = new ArrayList<Integer>(); for (int input : inputList) { if (input % 2 == 0) { result.add(input); } } return result; } }功能完成,测试通过之后,马上就回发现这段代码的Bad Smell,一共才5,6行的函数,居然和其他函数有4句代码是重复的,然后熊老师就开始给我们讲这个Session的主要目的。
对于List的处理,我们通常可以分为3类
第一类:对List中的每个元素,做同样的处理,得到一个新的集合,即遍历列表,针对每个elment做一元函数Func(x)的映射,因为一一对应,因此可简称为Map操作;
第二类:判断List中的的每个元素是否满足某个条件,对满足条件的元素进行相应的逻辑处理得到新的List。比方说filter,select,reduce等等操作。
第三类:求取集合中所有元素的总值,比方说求和操作,这类操作对于每个元素来说都是一个2元操作,func(init_value,x),即把当前element的值加初始值上。可以简称为Accumulation操作。
在Google的collections包中就根据这样的思想提供了相应的工具类,改造过后的代码
public class ListProcess { public static List<Integer> addOne(List<Integer> inputList) { return Lists.transform(inputList, new Function<Integer, Integer>() { @Override public Integer apply(@Nullable Integer integer) { return ++integer; } }); } public static List<Integer> multiplyTwo(List<Integer> inputList) { return Lists.transform(inputList, new Function<Integer, Integer>() { @Override public Integer apply(@Nullable Integer integer) { return integer * 2; } }); } public static List<Integer> getEvenList(List<Integer> inputList) { //注:不知为何,Google Collections没有把Filter也做在Lists里面,而是放到Collections2里面,返回一个Collection<E>,我们不得不自己转成List List<Integer> result = new ArrayList<Integer>(); result.addAll( Collections2.filter(inputList, new Predicate<Integer>() { @Override public boolean apply(@Nullable Integer integer) { return integer % 2 == 0; } })); return result; } }这样改完之后有什么好处呢?
第一:代码更直观,我们关注的只是function,predicate中的内容,也就是我们的核心业务逻辑。
第二:可以分布式处理,因为循环的时候CPU需要记录当前处理的元素下标之类的信号量,整个循环的处理过程会绑定在一个CPU上处理,就只能发挥一个CPU的计算能力,多核时代多浪费。如果使用Google的这种方式,就可以把一个很大的List拆分成一个个小的任务,然后并发执行之后再合并回来,也就是Map-Reduce的思想。
最后,熊老师推荐了一本经典书籍<Structure and Interpretation of Computer Programs>(计算机程序的构造和解释),说是看完之后,编程基本功会大大提高。刚加入清单,还没开始读,等读完之后再来写篇读后感。
补:关于为什么不把Filter的功能做到Lists类的原因参见:http://code.google.com/p/guava-libraries/wiki/IdeaGraveyard
发表评论
-
关于并发的思考
2015-02-08 22:33 4341并发数 并发数和2个因 ... -
使用Hystrix守护应用(3)
2015-01-02 22:04 12876监控HystrixCommand 除了隔离依赖服务的调用外,H ... -
使用Hystrix守护应用(2)
2014-12-30 14:35 16817接上篇(http://ningandjiao.iteye.co ... -
使用Hystrix守护应用(1)
2014-12-30 14:28 15287Hystrix(https://github.com/Netf ... -
Mac下同时安装多个版本的JDK
2014-04-14 21:42 33243JDK8 GA之后,小伙伴们喜大普奔,纷纷跃跃欲试,想体验一下 ... -
性能测试工具之Gatling
2014-01-15 19:27 17299Gatling一直是久闻其名但 ... -
JavaMail测试工具之GreenMail
2014-01-08 19:13 7369不管现在各种Mock框架的运用有多广,我个人在写单元测试的时候 ... -
定制一个Gradle Plugin --- project-structure
2014-01-03 21:23 8496最近在项目中遇到一个 ... -
Restful Spring MVC应用的Request验证
2013-12-26 15:05 23374在开放平台的时候,尤其是坐Rest服务的时候,因为用户可以给你 ... -
Spring MVC中的异常处理
2013-12-25 13:13 24172在一个良好的Rest架构的应用中,所有的异常都应该有对应的Ht ... -
Spring 4.0升级小贴士
2013-12-22 19:40 11441随着Spring4.0的发布,很多同志估计都在考虑升级的事情了 ... -
Spring4.0给我们带来什么?
2013-12-22 17:13 45033JDK8 对JDK8的支持,这个目前来说还是探索性质,毕竟Ja ... -
RESTful API版本控制策略
2013-12-15 19:51 31742做RESTful开放平台,一方面其API变动越少, 对API调 ... -
对象转换利器之Dozer
2013-12-14 22:46 19881在Java的世界中,经常会 ... -
基于Spring-WS的Restful API的集成测试
2013-11-28 19:41 9071在很多Java企业级应用中,Spring占据了非常重要的位置, ... -
TDD Of Spring JMS
2013-11-25 19:53 1760不知何时养成了习惯,在没有一个可运行的测试的时候,个人完全没有 ... -
Micro Service工具集之Swagger:可测试的样式化API文档
2013-09-28 19:55 44743在我之前的一篇博文中,介绍了Yammer开发团队贡献的开源微服 ... -
进击的Java开发
2013-07-14 20:48 5914今天在公司的邮件组中看到一组很有趣的讨论,这是我最喜欢目前公司 ... -
说说SpringBatch的领域概念
2013-06-21 20:32 3627谈到Spring Batch,会谈到 ... -
做项目时需要考虑的安全性问题
2013-04-16 20:20 4787在开发一个项目的时候,大家经常会忽略项目的安全性问题,有很多的 ...
相关推荐
《PDA进程管理工具——listprocess详解》 在信息技术领域,设备管理和系统监控是至关重要的环节,尤其是在嵌入式系统如个人数字助手(PDA)上。本文将深入探讨一个专为PDA设计的进程管理工具——listprocess,它...
If it matches more than one process name, TList displays only the PID of the first matching process. PID Displays detailed information about the process specified by the PID. For information ...
"process_item_process.zip_kill"这个主题涉及到两个主要的工具:`tlist`和`kill`,它们都是用于监控和管理进程的实用程序。在这个场景中,`tlist`用于查看系统中运行的所有进程,而`kill`则用于结束指定的进程。 `...
在IT领域,数据结构是计算机科学的基础,它们是组织和管理大量数据的有效方式。本话题主要聚焦于一种基本的数据结构——链表,以及如何用C语言实现链表的创建、插入和删除操作。C语言是一种底层编程语言,它允许直接...
VC环境下一个能够列举出所用进程的小程序。
标题 "in_net_process_list.zip_net process" 涉及到的是一个使用 Lua 语言编写的程序,该程序能够被 C/C++/Java 等支持 Lua 的环境调用。主要功能是在 Linux 系统下获取所有联网进程的相关信息,包括进程ID(PID)...
这个"list_process_id.zip"文件似乎包含了一个使用Visual C++编写的程序,其目标是列出任务管理器中的进程ID。让我们深入了解一下相关的知识点。 首先,我们要知道**任务管理器**是Windows操作系统的一个核心组件,...
Contents Page 0 Introduction.................................................................................................................................................................
本篇文章将详细解读提供的代码片段,并从中提取出关于`List Control`的关键知识点。 #### 二、关键知识点详解 ##### 1. 初始化与样式设置 - **删除所有项和列:** - `DeleteAllItems()`:该方法用于删除`List ...
4.7 Debugging an Already-running Process . . . . . . . . . . . . . . . . . . . . . . . . 4.8 Killing the Child Process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.9 ...
Finalizes DPLL registration process. In case a failure (clk-ref or clk-bypass is missing), the clock is added to retry list and the initialization is retried on later stage.
10. **代码示例**:文档中提供了C++调用ImageProcess的命令行方法,如`system("ImageProcess.exe list");`,显示所有支持的通用算法接口。 综上,ImageProcess是一个强大的图像预处理工具,它通过灵活的接口和参数...
2.1 The Software Development Process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.2 Example Program: Temperature Converter . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 ...
7. 回退(Process Returns) .............................................................................................6 8. 取回(Process Rollback) ....................................................
这个过程涉及到Windows API的调用,尤其是`CreateToolhelp32Snapshot`,`Process32First`和`Process32Next`等函数。下面将详细介绍如何实现这一功能。 首先,我们需要包含必要的头文件,如`windows.h`,它包含了...
TID_UI thread is the main thread in the browser process. This will be the same as the main application thread if CefInitialize() is called with a CefSettings.multi_threaded_message_loop value of false...
When you zoom in on a particular process you can list the DLLs it has loaded or the operating system resource handles it has open. A search capability enables you to track down a process that has a ...
It combines the features of two legacy Sysinternals utilities, Filemon and Regmon, and adds an extensive list of enhancements including rich and non-destructive filtering, comprehensive event ...