http://blog.csdn.net/ioriogami/article/details/12782141/
    兰姆达表达式
    链接

    list.sort()教程
    http://www.importnew.com/15259.html

    重点:
    1.humans.sort(Comparator.comparing(Human ::getName));——正序
    (h1,h2) -> - h1.getName().compareTo(h2.getName());——倒序

    2.定义compareByNameThenAge方法 ——这个方法拥有与Comparator对象里的
    compareTo方法完全相同的签名:

    1. public static int compareByNameThenAge(Human lhs, Human rhs) {
    2. if (lhs.name.equals(rhs.name)) {
    3. return lhs.age - rhs.age;
    4. } else {
    5. return lhs.name.compareTo(rhs.name);
    6. }
    7. }

    现在,我们要使用这个引用去调用humans.sort方法:

    1. humans.sort(Human::compareByNameThenAge);

    后一种方式可以实现复杂的排序,包括根据不同的优先级,当然如果能写在sql里就不用
    代码。

    接下来介绍方法
    reduce()
    方法reduce是翻译过来表示累加器,有3个重载方法,

    Optional reduce(BinaryOperator accumulator);
    T reduce(T identity, BinaryOperator accumulator);

    U reduce(U identity,BiFunction accumulator,BinaryOperator combiner);
    其中前2个是比较常用的,属于必须掌握的一些方法,
    第一个构造器一般是这样使用
    Arrays.stream(arr).reduce((a,b) -> a + b).get();
    这就表示求数组arr的和,如果想知道其中缘由,请自行输出a和b的内容即可知晓;
    第二个构造器一般是这样使用
    Arrays.stream(arr).reduce(0,(a,b) -> a + b).get();
    跟一个构造器的不同是这个构造器给了个初始值,这句代码里就给了个 0 也可以是其他的,但是需要是同类型的;

    第三个构造器是多线程流(parallelStream)使用的reduce,多线程下,累加器会有个问题,当前线程运算的结果是需要和其他线程的运算结果合并的,目前来说就是这么理解,至于对不对暂时先不追究,因为这个东西不常用;

    注意!!!!!!
    reduce 中的流内容是需要考虑是会有null的情况的,那如果有null的话则会报空指针异常;一般的操作是前面加个filter()将不符合规范的元素过滤掉;像这样:
    Arrays.stream(arr).filter(o -> o != null).reduce(0,(a, b) -> a + b)