Java8 lambda 和 Optional 的理解

本贴最后更新于 2279 天前,其中的信息可能已经时移世异

用了这么久的 Java8, 现在才觉得对于 lambda 和 Optional 有了一点理解。以前一直不理解 Optional 的意义,不就是判断控制吗? if(xxx != null) 也没什么妨碍理解的嘛,多清晰。

然后今天有段代码是这样:

if (queryRequest.getBrandId() != null && queryRequest.getBrandId() > 0) {
    paramMap.put("brandId", queryRequest.getBrandId());
}
if (queryRequest.getCusineId() != null && queryRequest.getCusineId() > 0) {
    paramMap.put("cuisineId", queryRequest.getCusineId());
}
if (queryRequest.getLocalId() != null && queryRequest.getLocalId() > 0) {
    paramMap.put("localId", queryRequest.getLocalId());
}
if (queryRequest.getFaceId() != null && queryRequest.getFaceId() > 0) {
    paramMap.put("faceId", queryRequest.getFaceId());
}
if (queryRequest.getNow() != null && queryRequest.getNow() > 0) {
    paramMap.put("now", queryRequest.getNow());
}
if (queryRequest.getPice() != null && queryRequest.getPice() > 0) {
    paramMap.put("pice", queryRequest.getPice());
}

用 Optional 和 lambda 重构后变成了这样...

queryRequest.getBrandId().filter(id -> id > 0).ifPresent(id -> paramMap.put("brandId", id +""));

queryRequest.getCuisineId().filter(id -> id > 0).ifPresent(id -> paramMap.put("cuisineId", id +""));

queryRequest.getLocalId().filter(id -> id > 0).ifPresent(id -> paramMap.put("localId", id +""));

queryRequest.getFaceId().filter(id -> id > 0).ifPresent(id -> paramMap.put("faceId", id +""));

queryRequest.getNow().filter(s -> !s.isEmpty()).ifPresent(v -> paramMap.put("now", v));

queryRequest.getPice().filter(p -> p > 0).ifPresent(p -> paramMap.put("foodIds", p +""));

当这样的判断拼参数有多达二三十处的时候,重构完真是看起来无比清爽。

还有一个计算然后返回参数的例子,如下,你们会喜欢哪一种写法呢?

package com.ctrip.gs.demo.web;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

public class Main {

    public static void main(String[] args) {
        QueryCondition queryCondition = new QueryCondition();
        System.out.println("0 -- " + Integer.toBinaryString(calByLambda(queryCondition)));

        List types = Arrays.asList(BinType.One, BinType.Three);
        queryCondition.setOptTypes(types);
        queryCondition.setTypes(types);
        System.out.println("2 lambda -- " + Integer.toBinaryString(calByLambda(queryCondition)));
        System.out.println("2 normal -- " + Integer.toBinaryString(calByNormal(queryCondition)));

        types = Arrays.asList(BinType.Two, BinType.Three, BinType.Four);
        queryCondition.setOptTypes(types);
        queryCondition.setTypes(types);
        System.out.println("3 lambda -- " + Integer.toBinaryString(calByLambda(queryCondition)));
        System.out.println("3 normal -- " + Integer.toBinaryString(calByNormal(queryCondition)));
    }

    private static Integer calByLambda(QueryCondition queryCondition) {
        return queryCondition.getOptTypes()
                .map(list -> list.stream()
                .map(BinType::getValue).reduce((a, b) -> a | b).orElse(0))
                .orElse(0);
  }

    private static Integer calByNormal(QueryCondition queryCondition) {
            int result = 0;
        List types = queryCondition.getTypes();
        if (types != null) {
            for (BinType type : types) {
                result = result | type.getValue();
            }
        }
        return result;
   }
}

class QueryCondition {
    private Optional<List<BinType>> optTypes = Optional.empty();

    private List types;

    public void setTypes(List types) {
        this.types = types;
    }

    public List getTypes() {
        return types;
    }

    public Optional<List<BinType>> getOptTypes() {
        return optTypes;
    }

    public void setOptTypes(List optTypes) {
        this.optTypes = Optional.of(optTypes);
    }
}

enum BinType {
    One(1), Two(1 << 1), Three(1 << 2), Four(1 << 3);

    int value;

    BinType(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3169 引用 • 8208 回帖 • 2 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 380222933

    听说 jdk8 在不久后就不再免费了?

推荐标签 标签

  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    143 引用 • 3752 回帖
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖 • 1 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 429 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    89 引用 • 345 回帖
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 40 关注
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 566 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 1 关注
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    71 引用 • 1737 回帖 • 4 关注
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖 • 1 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 701 关注
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    5 引用 • 13 回帖
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 31 回帖 • 8 关注
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 689 关注
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 232 回帖 • 3 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 726 关注
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 609 关注
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1427 引用 • 10046 回帖 • 473 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 4 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 43 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    19 引用 • 23 回帖 • 702 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    41 引用 • 130 回帖 • 283 关注
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 135 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 237 关注
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    495 引用 • 1386 回帖 • 330 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1454 回帖
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    16 引用 • 7 回帖 • 2 关注