前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java8函数式编程实践精华

Java8函数式编程实践精华

作者头像
互扯程序
发布2018-07-30 10:28:37
5410
发布2018-07-30 10:28:37
举报
文章被收录于专栏:互扯程序

Knowledge Sharing

知识分享

现在是资源共享的时代,同样也是知识分享的时代,如果你觉得本文能学到知识,请把知识与别人分享。

绪论

从java8开始,我们就可以通过java8中的StrameAPI与Lambda表达式实现函数式编程,可以让代码变得更加高效简洁。

现在很多企业的生产代码已经开始使用java8了,对于还没有使用过java8进行的编程的朋友们可以好好的学习一下,我在企业中写java8也有一段时间了,我想把我在实际开发中用到的一些场景与大家分享一下,大部分例子都来源于我开发项目中的实例。

其中我开发中用得比较多的是,Optional,SteameAPI与lambda。本文是实战帖,不做过多理论分析,直接讲场景与应用。Java9已经出来一段时间了,我发现我周围的很多做开发的朋友对java8中的一些新特性仍然不是很了解,也没在生产代码中使用过java8,不过我相信,很快,大部分公司都会用上java8的,我觉得java8与java5一样,是jdk历史上重要的一个版本更新,能给java编程带来巨大变化的一个版本。

场景

1、数据类型转换

直接上代码

代码语言:javascript
复制
//拿到所有的processNumber
List<String> processNumbers = param.getListProcessNumbers().stream().
map(QueryStateData::getProcessNumber).collect(Collectors.toList());

上面的代码的作用中把List<Object>,把其中我们需要的一个string字段变成List<String>,map是StringAPI中用来做数据类型转换的。

QueryStateData::getProcessNumber是方法引用,作用与object->object.getProcessNumber();一样,collect是收集器,通过收集器,把流转换成我们想要的List<String>。

2、对List数据进行数据筛选

代码语言:javascript
复制
//获取paymentChange
Optional<GaPaymentChange> changeOptional = listPaymentChange.stream().filter(p -> p.getTransferNo().equals(std.getProcessNumber())).findFirst();
if(changeOptional.isPresent()){
    GaPaymentChange paymentChange = changeOptional.get();
}

filter从名字上看,就知道是用来过数据过滤的,filter的函数式接口中需返回一个boolean值。findFirst是取其中的第一个,可以返回一个Optional对象。通过get方法我们很轻松的拿到了我们想要的结果。

3.Optional对象的应用

java8中Optional的出现是为了减少空指针异常的。看代码应用:

代码语言:javascript
复制
BigDecimal bigAbmout = Optional.ofNullable(paymentChange.getPaymentChangeMoney()).orElseGet(() -> new BigDecimal("0")).setScale(2, BigDecimal.ROUND_HALF_UP);

当ofNullable值为null时,我们可以给bigAbmout赋一个默认值。orElseGet的传参数是一个函数式接口,上面代码可以把它写成

lambda要返回一个对象。

代码语言:javascript
复制
Optional.ofNullable(paymentChange.getPaymentChangeMoney()).orElse(new BigDecimal("0")).setScale(2, BigDecimal.ROUND_HALF_UP);

orElse与orElseGet不同的是,它的参数直接是目标对象。

4.StreamAPI遍历对象

代码语言:javascript
复制
page.getRows().stream().forEach(x -> x.setOrderTime((DateUtils.dateFormat(x.getCreateTime(),DateUtils.DAT_SHORT_FORMATSS))));

上面的代码就是简单的把集合对象中orderTime的值做一下转换。

5.快速找到集合中想要匹配数据

代码语言:javascript
复制
//是否存在增补单
boolean match = gaPaymentChangeDetailList.stream().anyMatch(detail -> GaConstants.SUPPLEMENT_BILL.equals(detail.getIsSupplementBill()));

anyMatch配合lambda表达式可以在集合中快速找到我们想匹配的数据。

6.List中对象转换

代码语言:javascript
复制
List<Menu>menus= menuService.queryMenuList(query);List<MenuTreeVO> menuTrees = menus.stream().map(MenuTreeVO::new).collect(Collectors.toList());

利用StreamAPI两行代码就把List<Menu>转成了 List<MenuTreeVO>,其中的map(MenuTreeVO::new)等价于map(menu->new MenuTreeVO(menu)),所以,实现的一个另一个细节,我重写了MenuTreeVO的构造方法:

代码语言:javascript
复制
public MenuTreeVO(Menu menu) {
    this.id = menu.getId();    
    this.pId = menu.getParentId();    
    this.name = menu.getName();    
    this.open = true;
}

7.枚举中的应用

枚举中我们通常会与一个静态方法通过code去获取它对应的枚举,没有用java8我们一般是通过for循环实现的,看看java8代码:

代码语言:javascript
复制
/**
 * 获取枚举
 * 
 * @param code
 * @return
 */
public static OrderStateEnum getEnum(Integer code) {    
    return Stream.of(OrderStateEnum.values()).filter(e   ->e.code.equals(code)).findFirst().orElse(null);
}

8.lambda实现函数式接口

我们原来代码中的遇到的函数式接口,我们就可以用lambda来代替,简单的来说,就是new接口的地方。比如MQ发消息,我们传统的做法:

代码语言:javascript
复制
jmsTemplate.send(new MessageCreator() {    @Override
    public Message createMessage(Session session) throws JMSException {        return session.createTextMessage(String.valueOf(id));
    }
});

这个函数式接口可以用lambda一行代码轻松实现:

代码语言:javascript
复制
jmsTemplate.send(session -> session.createTextMessage(String.valueOf(id)));

8.去重、求和、最大值、最小值

用法都比较类似,这里就不一一列举了。下面看一个去重的。stream下面的方法也就那么多个,要用的时候可以一个个点来看看,从英文意思我们可大概知道那些方法基本上用来做什么的了。其实很多用法我也是在实际开发中慢慢研究出来的,也没看很多的资源。

代码语言:javascript
复制
List<Color> colors = skusResult.getValue().stream().map(Sku::getColor).distinct().collect(Collectors.toList());

上面是对List<Color>中的Color对象去重,记得重写hashCode()与equeals()方法。

结语

在实际的开发中,能应用的场景还有很多,我上面列举的一些可能用得会相对多一些,也有很多应用场景我没有提到,java8函数式编程的也许远远不止这些,以后遇到好的场景我再补充,如果大家有好的应用,欢迎留言讨论。

哈 博小伙伴一开心 博主收集了一套很不错java学习视频教程 在这里送给大家 在公众号内回复 “java” 即可获取奥

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-06-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 互扯程序 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 绪论
  • 场景
    • 1、数据类型转换
      • 2、对List数据进行数据筛选
        • 3.Optional对象的应用
          • 4.StreamAPI遍历对象
            • 5.快速找到集合中想要匹配数据
              • 6.List中对象转换
                • 7.枚举中的应用
                  • 8.lambda实现函数式接口
                    • 8.去重、求和、最大值、最小值
                    • 结语
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档