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方法完全相同的签名:
public static int compareByNameThenAge(Human lhs, Human rhs) {
if (lhs.name.equals(rhs.name)) {
return lhs.age - rhs.age;
} else {
return lhs.name.compareTo(rhs.name);
}
}
现在,我们要使用这个引用去调用humans.sort方法:
humans.sort(Human::compareByNameThenAge);
后一种方式可以实现复杂的排序,包括根据不同的优先级,当然如果能写在sql里就不用
代码。
接下来介绍方法
reduce()
方法reduce是翻译过来表示累加器,有3个重载方法,
Optional reduce(BinaryOperator accumulator);
T reduce(T identity, BinaryOperator
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)