工欲善其事必先利其器
引言
java8 是革命性的创新,引入了函数式编程,代码编写产生巨大的改变,为我这样的码农带来了很大的便捷性,虽然1.8发布了这么久,但是编码思维上还是半停留在结构式,函数式用的较少,这次也是发现了好玩的工具,简单介绍一下java8,然后分享一下小工具。
java8
简单的来说引入了三大类函数式接口,分别如下:
一、Predicate:接口定义了一个名叫test的抽象方法,它接受泛型 T对象,并返回一个boolean
二、Consumer:定义了一个名叫accept的抽象方法,它接受泛型T 的对象,没有返回(void)
三、Function:接口定义了一个叫作apply的方法,它接受一个 泛型T的对象,并返回一个泛型R的对象
集合操作
在引入了stream流式处理后,我们处理集合不需要反复for循环去处理,在过滤,映射,收集方面增加了更多的便捷性。
我们在频繁操作集合时,便会反复的在stream的一套标准流程,代码看上去并不整洁,然后在网上看到工具封装,打开了思路,封装如下:
只是进行了简单的封装,健壮性方面的考量未做。引入工具后来看下效果
上下两个方格内的功能一样,但是简洁度却不一样。下边的更关注逻辑性,更简洁。上代码
package com.util;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class Util {
/** 过滤 */
public static List filter(List list, Predicate super T> predicate) {
return list.stream().filter(predicate).collect(Collectors.toList());
}
/** 映射 */
public static List map(List list, Function super T, ? extends R> mapper) {
return list.stream().map(mapper).collect(Collectors.toList());
}
/** 过滤和映射 */
public static List filterAndMap(List list,
Predicate super T> predicate,
Function super T, ? extends R> mapper) {
return list.stream().filter(predicate).map(mapper).collect(Collectors.toList());
}
/** list 转 map */
public static Map toMap(List list, Function super T, ? extends R> mapper) {
return list.stream().collect(Collectors.toMap(mapper, Function.identity(), (i1, i2) -> i1));
}
/** 分组 */
public static Map> groupBy(List list, Function super T, ? extends R> mapper) {
return list.stream().collect(Collectors.groupingBy(mapper, Collectors.toList()));
}
}
public static void main(String[] args) {
List list = new ArrayList<>();
list.add(new User("张三", 12, "红色"));
list.add(new User("李四", 20, "蓝色"));
list.add(new User("王五", 19, "红色"));
list.add(new User("赵六", 17, "蓝色"));
list.add(new User("钱八", 18, "绿色"));
// 过滤姓名中有五的用户
List result = list.stream().filter(item -> item.getName().contains("五")).collect(Collectors.toList());
// 过滤颜色为红色的用户
List colorList = list.stream().filter(item -> item.getColor().equals("红色")).collect(Collectors.toList());
// 根据颜色映射成map
Map map = list.stream().collect(Collectors.toMap(User::getColor, Function.identity()));
/************************* 简化版 *********************************/
List result1 = Util.filter(list, item -> item.getName().contains("五"));
List result2 = Util.filter(list, item -> item.getColor().equals("红色"));
Map map1 = Util.toMap(list, User::getColor);
}
工具封装并不完善,只是提供个简单的思路,希望对小伙伴有所帮助。
本文暂时没有评论,来添加一个吧(●'◡'●)