小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
java8的lambda函数类是Function<T, R>,代表输入一个T,返回一个R,然后Function有三个特殊变体,分别是Supplier(提供者函数,不用接收T,返回一个R),Predicate(谓语函数,接收T,返回真值型),Consumer(接收T,返回void)。
lambda方法引用只是写法不一样而已。
Function<String, Integer> lengthFun = str -> str.length(); // 返回一个字符串的长度
Supplier randomFun = () -> new Random().nextInt();// 生成一个随机数返回
Predicate isOddFun = num -> num % 2 == 0; // 判断一个数是否为偶数,返回真值型
Consumer printFun = str -> System.out.println(str);// 打印字符串,返回void
双冒号方法引用可以看做是箭头表达式的简写,拿list.forEach,forEach接收一个Consumer函数(接收一个参数,返回void),例子:
List list = Arrays.asList("hello", "world");
list.forEach(str -> {
System.out.println(str);
});
// 如果花括号只有一行代码,则可以简化,等价于
list.forEach(str -> System.out.println(str));
// 再简化为方法引用,等价于
list.forEach(System.out::println);
对于forEach,只要返回void的任何method(或无返回的代码片段)都可以做为箭头右边的参数。 筛选 list 某个属性
List collect = list.stream().map(Operation::getKitsId).filter(x -> x != null).collect(Collectors.toList());
2.list to map
Map<String, CKits> collect1 = list.stream()
.collect(Collectors.toMap(CKits::getKitsId, t -> t, (k1, k2) -> k1));
3.list to Map<String,String>
Map<String, String> collect1 = cKitsService.findByKitsIdIn(collect).stream()
.collect(Collectors.toMap(CKits::getKitsId, CKits::getKitsName));
java.util.List 集合现在已经添加了 sort 方法。而且 Java 编译器能够根据类型推断机制判断出参数类型,这样,你连入参的类型都可以省略啦,怎么样,是不是感觉很骚气呢!
java.util.List.sort
default void sort(Comparator<? super E> c) {
Object[] a = this.toArray();
Arrays.sort(a, (Comparator) c);
ListIterator<E> i = this.listIterator();
for (Object e : a) {
i.next();
i.set((E) e);
}
}
好了!你以为这就结束了吗,不!它还可以更短!(得益于Comparator接口中还提供了stack默认方法,也就是说接口中不是只可有default默认实现,还可以有静态方法)
names.sort(Comparator.reverseOrder());