Java常用的lambda表达式及其学习的方法论

今天来研究一下几个常用的lambda表达式。
目前常用的lambda表达式的用法,列举两个:

1.list转map<Object,Object>
1 orgMap = recordList.stream().collect(Collectors.toMap(SysOrg::getOrgNum, param -> param, (k1, k2) -> k1));
Map<String, Long> tunnelMap = tunnelList.stream().collect(Collectors.toMap(
                t -> t.getDeviceNum() + UNDERLINE_SEPARATOR + t.getTunnelNum(), Tunnel::getId));

2.list转map<Object,List>
用groupingBy
Map<String, List<GjyRouteInfo>> routes = gjyRouteInfos.stream().collect(Collectors.groupingBy(GjyRouteInfo::getRouteId));

首先看stream()方法:

这里是引用什么是 Stream?
Stream(流)是一个来自数据源的元素队列并支持聚合操作
元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。
和以前的Collection操作不同, Stream操作还有两个基础的特征:
Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。
内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。
https://www.runoob.com/java/java8-streams.html

以上聚合操作都是通过转换后的流执行的。
在这里插入图片描述
stream()有很多聚合方法,首先看最重要的collect:

collect

collect有两个构造器
在这里插入图片描述
看第一个,这里的Supplier是提供数据,biConsumer消费,biConsumer1获得biConsumer输出的再次消费,例:

paramsList.stream().collect(HashMap::new, (map, p) -> map.put(p.getOrgNum(),p.getValue()), Map::putAll);

第二个,即是接收一个Collector对象,即人家collect完的,例:

paramsList.stream().collect(Collectors.toMap(SysCommonParams::getCode, SysCommonParams::getCode);

Collectors创建的对象,其宿命就是被collect方法接收。
在这里插入图片描述
这里方法也很多,最常用的还是groupingBy
来看下它的三种构造器

groupingBy

在这里插入图片描述

1.直接传入一个function,获得的map,默认其value为数组对象
Map<String, List<SysCommonParams>> collect = paramsList.stream().collect(Collectors.groupingBy(SysCommonParams::getCode));
2.  后面还传一个方法,获得的map,其value为方法返回值。     
Map<String, Long> collect1 = paramsList.stream().collect(Collectors.groupingBy(SysCommonParams::getCode, Collectors.counting());
3.可以指定分组后map的类型
LinkedHashMap<String, Long> collect2 = paramsList.stream().collect(Collectors.groupingBy(SysCommonParams::getCode, LinkedHashMap::new, Collectors.counting()));
       

map

在这里插入图片描述
map里面是传一个function,用于映射元素到对应到的结果,比如:

        paramsList.stream().map(i->i.getOrgNum()+"11")

sorted

在这里插入图片描述
看一下Comparator的定义

@FunctionalInterface
public interface Comparator<T> {
    int compare(T var1, T var2);

其compare方法有两个参数,其实就可以理解,是两个参数进行比较。
默认可以传空,也可以传一个比较器,自定义排序规则,例:

List<SysCommonParams> collect4 = paramsList.stream().sorted((a, b) -> a.getOrgNum().equals(b.getOrgNum()) ? 1 : 0).collect(Collectors.toList());

filter

在这里插入图片描述
看一下Predicate的定义

public interface Predicate<T> {
    boolean test(T var1);

其只有一个参数,加上filter的意思,过滤,可以理解是拿这个参数的某个自定义条件去做过滤。自己写了一个,发现可以。

paramsList.stream().filter(p->p.getOrgNum()!=null);

总结:

剩下还有比较多的方法,其实都可以以同样的方法去理解,Comparator、Predicate,说到底都是函数的一个实现,把它理解成不同的数学公式就可以了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值