日常开发中,我们很多时候需要用到Java 8
的Lambda
表达式,它允许把函数作为一个方法的参数,让我们的代码更优雅、更简洁。所以整理了一波工作中,我常用,有哪些Lambda
表达式。看完一定会有帮助的。
list转map
工作中,我们经常遇到list
转map
的案例。
Collectors.toMap
就可以把一个list
数组转成一个Map
。
代码如下:
1 | public class TestLambda { |
类似的,还有Collectors.toList()
、Collectors.toSet()
,表示把对应的流转化为list
或者Set
。
filter()过滤
从数组集合中,过滤掉不符合条件的元素,留下符合条件的元素。
1 | List<UserInfo> userInfoList = new ArrayList<>(); |
foreach遍历
foreach 遍历list,遍历map,真的很丝滑。
1 | /** |
groupingBy分组
提到分组,相信大家都会想起SQL
的group by
。我们经常需要一个List做分组操作。比如,按城市分组用户。在Java8之前,是这么实现的:
1 | List<UserInfo> originUserInfoList = new ArrayList<>(); |
而使用Java8的groupingBy
分组器,清爽无比:
1 | Map<String, List<UserInfo>> result = originUserInfoList.stream() |
sorted+Comparator 排序
工作中,排序的需求比较多,使用sorted+Comparator排序,真的很香。
1 | List<UserInfo> userInfoList = new ArrayList<>(); |
distinct去重
distinct
可以去除重复的元素:
1 | List<String> list = Arrays.asList("A", "B", "F", "A", "C"); |
findFirst 返回第一个
findFirst
很多业务场景,我们只需要返回集合的第一个元素即可:
1 | List<String> list = Arrays.asList("A", "B", "F", "A", "C"); |
anyMatch是否至少匹配一个元素
anyMatch
检查流是否包含至少一个满足给定谓词的元素。
1 | Stream<String> stream = Stream.of("A", "B", "C", "D"); |
allMatch 匹配所有元素
allMatch
检查流是否满足所有给定谓词的元素。
1 | Stream<String> stream = Stream.of("A", "B", "C", "D"); |
map转换
map
方法可以帮我们做元素转换,比如一个元素所有字母转化为大写,又或者把获取一个元素对象的某个属性,demo
如下:
1 | List<String> list = Arrays.asList("lision", "jingge"); |
Reduce
Reduce可以合并流的元素,并生成一个值
1 | int sum = Stream.of(1, 2, 3, 4).reduce(0, (a, b) -> a + b); |
peek 打印个日志
peek()
方法是一个中间Stream
操作,有时候我们可以使用peek
来打印日志。
1 | List<String> result = Stream.of("程序员阿晶", "晶哥哥很专祎", "筱筱晶哥哥") |
Max,Min最大最小
使用lambda流求最大,最小值,非常方便。
1 | List<UserInfo> userInfoList = new ArrayList<>(); |
count统计
一般count()
表示获取流数据元素总数。
1 | List<UserInfo> userInfoList = new ArrayList<>(); |
常用函数式接口
其实lambda离不开函数式接口,我们来看下JDK8常用的几个函数式接口:
Function<T, R>
(转换型): 接受一个输入参数,返回一个结果Consumer<T>
(消费型): 接收一个输入参数,并且无返回操作Predicate<T>
(判断型): 接收一个输入参数,并且返回布尔值结果Supplier<T>
(供给型): 无参数,返回结果
Function<T, R>
是一个功能转换型的接口,可以把将一种类型的数据转化为另外一种类型的数据
1 | private void testFunction() { |
Consumer<T>
是一个消费性接口,通过传入参数,并且无返回的操作
1 | private void testComsumer() { |
Predicate<T>
是一个判断型接口,并且返回布尔值结果.
1 | private void testPredicate() { |
Supplier<T>
是一个供给型接口,无参数,有返回结果。
1 | private void testSupplier() { |
这几个函数在日常开发中,也是可以灵活应用的,比如我们DAO操作完数据库,是会有个result的整型结果返回。我们就可以用Supplier<T>
来统一判断是否操作成功。如下:
1 | private void saveDb(Supplier<Integer> supplier) { |