`

关于LISt Process...

 
阅读更多
   前2天听了熊老师的一个Session,关于List Process的,差点忘了总结,现记录如下:

从一个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
  • 大小: 166.7 KB
分享到:
评论

相关推荐

    listprocess.rar

    《PDA进程管理工具——listprocess详解》 在信息技术领域,设备管理和系统监控是至关重要的环节,尤其是在嵌入式系统如个人数字助手(PDA)上。本文将深入探讨一个专为PDA设计的进程管理工具——listprocess,它...

    查看进程工具tlist.exe

    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

    "process_item_process.zip_kill"这个主题涉及到两个主要的工具:`tlist`和`kill`,它们都是用于监控和管理进程的实用程序。在这个场景中,`tlist`用于查看系统中运行的所有进程,而`kill`则用于结束指定的进程。 `...

    List-creation-process.rar_creation

    在IT领域,数据结构是计算机科学的基础,它们是组织和管理大量数据的有效方式。本话题主要聚焦于一种基本的数据结构——链表,以及如何用C语言实现链表的创建、插入和删除操作。C语言是一种底层编程语言,它允许直接...

    list-all-of-the-process.zip_The Process

    VC环境下一个能够列举出所用进程的小程序。

    in_net_process_list.zip_net process

    标题 "in_net_process_list.zip_net process" 涉及到的是一个使用 Lua 语言编写的程序,该程序能够被 C/C++/Java 等支持 Lua 的环境调用。主要功能是在 Linux 系统下获取所有联网进程的相关信息,包括进程ID(PID)...

    list_process_id.zip_Visual C++ process_task manager_visual c

    这个"list_process_id.zip"文件似乎包含了一个使用Visual C++编写的程序,其目标是列出任务管理器中的进程ID。让我们深入了解一下相关的知识点。 首先,我们要知道**任务管理器**是Windows操作系统的一个核心组件,...

    iso-iec 14496-10(3rd_2006-03-01)_MPEG4_AVC_H264.pdf

    Contents Page 0 Introduction.................................................................................................................................................................

    list control(使用说明).txt

    本篇文章将详细解读提供的代码片段,并从中提取出关于`List Control`的关键知识点。 #### 二、关键知识点详解 ##### 1. 初始化与样式设置 - **删除所有项和列:** - `DeleteAllItems()`:该方法用于删除`List ...

    最新版的DebuggingWithGDB7.05-2010

    4.7 Debugging an Already-running Process . . . . . . . . . . . . . . . . . . . . . . . . 4.8 Killing the Child Process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.9 ...

    fsys.rar_The Process

    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.

    ImageProcess文档1

    10. **代码示例**:文档中提供了C++调用ImageProcess的命令行方法,如`system("ImageProcess.exe list");`,显示所有支持的通用算法接口。 综上,ImageProcess是一个强大的图像预处理工具,它通过灵活的接口和参数...

    python programming

    2.1 The Software Development Process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.2 Example Program: Temperature Converter . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 ...

    WorkFlow Specify

    7. 回退(Process Returns) .............................................................................................6 8. 取回(Process Rollback) ....................................................

    VC如何枚举系统当前进程listprocess

    这个过程涉及到Windows API的调用,尤其是`CreateToolhelp32Snapshot`,`Process32First`和`Process32Next`等函数。下面将详细介绍如何实现这一功能。 首先,我们需要包含必要的头文件,如`windows.h`,它包含了...

    Cef代码使用说明

    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...

    ProcessExplorer

    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 ...

    Process Monitor v3.50

    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 ...

Global site tag (gtag.js) - Google Analytics