Java 8 简化代码(1)

这篇具有很好参考价值的文章主要介绍了Java 8 简化代码(1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Lambda 表达式

Lambda 表达式的初衷是,进一步简化匿名类的语法

//匿名类
new Thread(new Runnable(){
    @Override
    public void run(){
        System.out.println("hello1");
    }
}).start();
//Lambda表达式
new Thread(() -> System.out.println("hello2")).start();

使用 Java 8 简化代码

  • 使用 Stream 简化集合操作;
  • 使用 Optional 简化判空逻辑;
  • JDK8 结合 Lambda 和 Stream 对各种类的增强。

使用 Stream 简化集合操作

Lambda 表达式可以帮我们用简短的代码实现方法的定义,给了我们复用代码的更多可能性。利用这个特性,我们可以把集合的投影、转换、过滤等操作抽象成通用的接口,然后通过 Lambda 表达式传入其具体实现,这也就是 Stream 操作。

我们看一个具体的例子。这里有一段 20 行左右的代码,实现了如下的逻辑:

  • 把整数列表转换为 Point2D 列表;
  • 遍历 Point2D 列表过滤出 Y 轴 >1 的对象;
  • 计算 Point2D 点到原点的距离;
  • 累加所有计算出的距离,并计算距离的平均值。
private static double calc(List<Integer> ints) {
    //临时中间集合
    List<Point2D> point2DList = new ArrayList<>();
    for (Integer i : ints) {
        point2DList.add(new Point2D.Double((double) i % 3, (double) i / 3));
    }
    //临时变量,纯粹是为了获得最后结果需要的中间变量
    double total = 0;
    int count = 0;

    for (Point2D point2D : point2DList) {
        //过滤
        if (point2D.getY() > 1) {
            //算距离
            double distance = point2D.distance(0, 0);
            total += distance;
            count++;
        }
    }
    //注意count可能为0的可能
    return count >0 ? total / count : 0;
}

现在,我们可以使用 Stream 配合 Lambda 表达式来简化这段代码。简化后一行代码就可以实现这样的逻辑,更重要的是代码可读性更强了,通过方法名就可以知晓大概是在做什么事情。比如:

  • map 方法传入的是一个 Function,可以实现对象转换;
  • filter 方法传入一个 Predicate,实现对象的布尔判断,只保留返回 true 的数据;
  • mapToDouble 用于把对象转换为 double;
  • 通过 average 方法返回一个 OptionalDouble,代表可能包含值也可能不包含值的可空 double。

下面的第三行代码,就实现了上面方法的所有工作:

List<Integer> ints = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
double average = calc(ints);
double streamResult = ints.stream()
        .map(i -> new Point2D.Double((double) i % 3, (double) i / 3))
        .filter(point -> point.getY() > 1)
        .mapToDouble(point -> point.distance(0, 0))
        .average()
        .orElse(0);

Java 8 类对于函数式 API 的增强

要通过 HashMap 实现一个缓存的操作,在 Java 8 之前我们可能会写出这样的 getProductAndCache 方法:先判断缓存中是否有值;如果没有值,就从数据库搜索取值;最后,把数据加入缓存。

private Map<Long, Product> cache = new ConcurrentHashMap<>();

private Product getProductAndCache(Long id) {
    Product product = null;
    //Key存在,返回Value
    if (cache.containsKey(id)) {
        product = cache.get(id);
    } else {
        //不存在,则获取Value
        //需要遍历数据源查询获得Product
        for (Product p : Product.getData()) {
            if (p.getId().equals(id)) {
                product = p;
                break;
            }
        }
        //加入ConcurrentHashMap
        if (product != null)
            cache.put(id, product);
    }
    return product;
}

而在 Java 8 中,我们利用 ConcurrentHashMap 的 computeIfAbsent 方法,用一行代码就可以实现这样的繁琐操作:

private Product getProductAndCacheCool(Long id) {
    return cache.computeIfAbsent(id, i -> //当Key不存在的时候提供一个Function来代表根据Key获取Value的过程
            Product.getData().stream()
                    .filter(p -> p.getId().equals(i)) //过滤
                    .findFirst() //找第一个,得到Optional<Product>
                    .orElse(null)); //如果找不到Product,则使用null
    }
}

computeIfAbsent 方法在逻辑上相当于:文章来源地址https://www.toymoban.com/news/detail-805946.html

if (map.get(key) == null) {
  V newValue = mappingFunction.apply(key);
  if (newValue != null)
    map.put(key, newValue);
}

到了这里,关于Java 8 简化代码(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • sass变量+函数,简化代码工作量

    2024年02月08日
    浏览(60)
  • 重构改善既有代码的设计-学习(四):简化条件逻辑

              可以将大块代码分解为多个独立的函数,根据每个小块代码的用途,为分解而得的新函数命名。对于条件逻辑,将每个分支条件分解成新函数还可以带来更多好处:可以突出条件逻辑,更清楚地表明每个分支的作用,并且突出每个分支的原因。         例如:

    2024年01月25日
    浏览(33)
  • 轻松构建低代码工作流程:简化繁琐任务的利器

    前言 近年来,企业一直在寻求简化运营和提高效率的方法,较为流行的一个解决方案是使用低代码自动化工作流。现如今,不管是审批逻辑、并行流程还是动态逻辑,开发人员逐渐会愿意选择引入某种业务流程管理(BPM)与自己的应用程序集成。原因显而易见,因为业务流程

    2024年04月16日
    浏览(34)
  • 简化Java单元测试数据

    EasyModeling 是我在2021年圣诞假期期间开发的一个 Java 注解处理器,采用 Apache-2.0 开源协议。它可以帮助 Java 单元测试的编写者快速构造用于测试的数据模型实例,简化 Java 项目在单元测试中准备测试数据的工作,在提高编写效率的同时,使单元测试更加整洁易读。经过一年的

    2024年02月15日
    浏览(36)
  • pytorch--在本地搭建chatGpt简化版,实现聊天,写代码功能

    体验了一下new bing,很不错,但是最近觉得这种模型还是搭建在自己电脑上最好,看了下github上的chatGLM项目,这个项目在致力于将一个大语言模型搭建在个人机上,我对此惊叹不已,就按照其流程下载下来搭建在自己电脑上了,这种模型运行在自己电脑上的感觉不会有那种隐

    2023年04月14日
    浏览(32)
  • Yolov5-detect.py代码简化(便于移植)

    2024年02月06日
    浏览(41)
  • 低代码(Low-Code)技术简化开发难度,快速搭建应用

    目录 一、低代码技术定义 二、低代码技术优势 1.提高企业的工作效率 2.降低企业的开发成本 3.提高应用程序和业务流程的质量 三、稳定性和生产率的最佳实践 三、最后 随着数字化时代的到来,低代码(Low-Code)技术已经成为了企业数字化转型的重要工具。低代码技术是指通

    2024年01月25日
    浏览(42)
  • window系统配置PCL的简化方法(不需要复制一百多个依赖项目名称,直接导入配置表)

    百度网盘: 链接:https://pan.baidu.com/s/1WQQ8kaDilaagjoK5IrYZzA  提取码:1111  注意:直接解压在E盘!!!!! 不解压在E盘也可以,后续替换环境变量和属性表文件内的地址就行(props文件)   点击电脑 设置 搜索编辑系统环境变量 点击Path 添加如下变量 E:PCL1.11.0bin E:PCL1.11.03rdP

    2024年02月09日
    浏览(35)
  • Java开发中使用sql简化开发

    使用sql语句简化开发 引语:在Java开发中,我们更希望数据库能直接给我们必要的数据,然后在业务层面直接使用,所以写一个简单的sql语句有助于提高Java开发效率,本文由简单到复杂。 使用MySQL数据库,先创建一个简单的表 开始玩吧,先看原始数据 以上原始数据,是我们

    2024年02月16日
    浏览(33)
  • Qodana & IntelliJ IDEA,看代码质量平台如何简化IDE本地化!

    IntelliJ IDEA,是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。 当程序员规划涉及代码重构的

    2024年02月05日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包