jdk1.8lambda小记

140 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

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());