当前位置:

首页 > 编程开发 > 哪些Java开发技巧并不常用?

哪些Java开发技巧并不常用?

BigDecimal我们先来看一段代码:BigDecimalb1=newBigDecimal(0.1);System.out.println(b1);大家可以猜一下这个执行的结果会是什么内容呢?结果是0.1么?如果不是0.1的话,那么执行输出的话,会出现什么内容,如果你知道,那么恭喜你,如果你不知道的话,那么就得认真学习一下拉。结果显而易见,肯定不是0.1。我们看看他的执行结果是什么内容,然后再来说,应该使用什么方式。0.100000000000000005551115123125782702118158

BigDecimal

我们先来看一段代码:

BigDecimal b1= new BigDecimal(0.1);
System.out.println(b1);

大家可以猜一下这个执行的结果会是什么内容呢?

结果是 0.1 么?如果不是 0.1 的话,那么执行输出的话,会出现什么内容,如果你知道,那么恭喜你,如果你不知道的话,那么就得认真学习一下拉。

结果显而易见,肯定不是 0.1 。

我们看看他的执行结果是什么内容,然后再来说,应该使用什么方式。

0.1000000000000000055511151231257827021181583404541015625

当看到这个内容的,很多人恍然大悟,一眼就看出来,精度丢失了,所以导致了这种情况的发生,成这种问题的原因是 0.1 这个数字计算机是无法精确表示的,送给 BigDecimal 的时候就已经丢精度了.double类型 那么我们应该怎么去处理这个 double 类型的参数呢?

其实很简单,方式有两种,第一种:

BigDecimal bigDecimal = new BigDecimal("0.1");
System.out.println(bigDecimal);

第二种:

BigDecimal bigDecimal1 = BigDecimal.valueOf(0.1);
System.out.println(bigDecimal1);

实际上,在本质上,这两个方法并没有区别,因为。valueOf 在实现上,就是转成了一个字符串。

BigDecimal 当中的 valueOf 中是把浮点数转换成了字符串来构造的 BigDecimal,因此避免了问题。

源码如下:

哪些Java开发技巧并不常用?

compareTo

这个方法我们经常用到,用来比较 BigDecimal 的,在 BigDecimal 中使用 equals 可能会导致结果错误,BigDecimal 中提供了 compareTo 方法,在很多时候需要使用 compareTo 比较两个值。如下所示:

        BigDecimal b1 = new BigDecimal("10.0");
        BigDecimal b2 = new BigDecimal("10.00");
        System.out.println(b1.equals(b2));
        System.out.println(b1.compareTo(b2));

我们肯定遇到过这种,用 compareTo 比较的时候,自己臆想的和代码执行的,肯定不一样,于是就有了自己实验的过程。

出现此种结果的原因是,equals不仅比较了值是否相等,还比较了精度是否相同。示例中,由于两个值的精度不同,所有结果也就不相同。而 compareTo 是只比较值的大小。返回的值为-1(小于),0(等于),1(大于)。

List

说到 List 绝对不陌生,甚至天天在用,List 转数组,应该怎么操作呢?

其实很简单,就是 toArray。

toArray

List list = new ArrayList<>();

String[] strings = list.toArray(new String[list.size()]);

两个方法,不带参数的 toArray 就是直接调用 Arrays.copyOf(elementData, size),将 List 中的元素对象的引用装在一个新的生成数组中。

带参数的则是会返回指定类型(必须为 List 元素类型的父类或本身)的数组对象,如果 a.length 小于 List 元素个数就直接调用 Arrays 的 copyOf() 方法进行拷贝并且返回新数组对象,新数组中也是装的 List 元素对象的引用,否则先调用System.arraycopy()将 List 元素对象的引用装在a数组中,如果a数组还有剩余的空间,则在 a[size] 放置一个 nullsize 就是 list 中元素的个数,这个 null 值可以使得 toArray(T[] a) 方法调用者可以判断 null 后面已经没有 list 元素了.

其实在业务中,我们更多的都是直接使用第二个,第一个五参数的方法,很多时候都是作为测试来存在的。

JDK8的小玩意

其实了不起更想说的,还是 JDK8 中的一些肖操作,他会精简我们的代码,而且,逻辑也更加的清晰,为什么这么说,因为现在百分之八九十的公司都还是在使用 JDK8 ,升级版本的,还并不是那么的多,毕竟很少有公司会吧之前的项目随便更换某些必要的依赖的版本号,除非迫不得已。

flatMap

其实这个方法,是真的不常用,因为我们用到的,很多都是 forEach ,或者 filter ,或者 map 这些都是我们比较常用的。

而 flatMap 相当于 map+flat,通过 map 把每一个元素替换为一个流,然后展开这个流。比如,我们要统计所有订单的总价格,可以有两种方式:

就是 Order 里面有一个 Detail 的信息,而这个 Order 是一个 List  而 Detail 也是一个 List,就比如下面

public class Order {

private String id;

private List details;

}

public class Order {

private String productId;

private Double productPrice;

private Integer productQuantity;

}

如果我们想要统计订单总价,如果 Order 表中已经存在了这个价格这块的内容了,那当然好,如果没有,那么就得去汇总详情了,不是么?

//求和使用flatMap
orders.stream().flatMap(order -> order.getDetails().stream()).mapToDouble(item -> item.getProductQuantity() * item.getProductPrice()).sum();


//求和使用flatMapToDouble
orders.stream().flatMapToDouble(order ->order.getDetails().stream().mapToDouble(item -> item.getProductQuantity() * item.getProductPrice())).sum();

其实,了不起觉得,JDK8 中才是真的有很多了不起的内容,再比如我们统计list中的数据,已经不在需要自己去做for循环来进行比对了,而是直接通过方法来获取。

//获取最大
Integer id = userList.stream().map(User::getId).max(Integer::compareTo).get();
//获取最小
Integer id1 = userList.stream().map(User::getId).min(Integer::compareTo).get();
//获取id数量
long count = userList.stream().map(User::getId).count();
//总和
int sum = userList.stream().mapToInt(User::getId).sum();
//获取平均值
double d = userList.stream().mapToInt(User::getId).average().getAsDouble();

分组统计

  //分组统计
    Map map = userList.stream().collect(Collectors.groupingBy(User::getName, Collectors.counting()));
  //分组 Collectors.groupingBy(属性名)
 Map> map = list.stream().collect(Collectors.groupingBy(Person::getAge));
    //将名字全转换为大写
    List list = userList.stream().map(User::getName).map(String::toUpperCase).collect(Collectors.toList());
    //获取忽略第一个并取前几条数据
    List list1 = userList.stream().skip(1).limit(2).collect(Collectors.toList());
    //distinct() 去重;collect(Collectors.toList())。封装成集合
    List collect = userList.stream().distinct().collect(Collectors.toList());
本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发
相关文章 更多
谷歌浏览器Mac版入口
谷歌浏览器Mac版入口

谷歌浏览器Mac版官方安装指南 谷歌浏览器Mac版官方安装入口是https://www.google.com/chrome/,需macOS 12+系统、500MB空间,下载.dmg后拖入应用程序安装,支持多设备同步、性能优化与隐私保护功能。 苹果电脑Chrome的安装入口究竟在哪里?这个问题最近可是

Chrome浏览器JS脚本不运行怎么办
Chrome浏览器JS脚本不运行怎么办

Chrome中JavaScript未执行需依次检查:一、移除站点级禁用并添加允许域名;二、开启全局JavaScript开关;三、禁用干扰扩展;四、在开发者工具中启用JavaScript;五、重置内容设置为默认。 有时在Chrome里打开网页,会发现交互按钮点了没反应,数据加载不出来,页面仿佛“静止”

IE浏览器怀旧版在线网址
IE浏览器怀旧版在线网址

IE浏览器怀旧版在线网址:一次精准的技术时光回溯 最近,不少老用户和怀旧爱好者在反复搜索一个问题:那个经典的Internet Explorer,如今还能在哪里原汁原味地体验到?答案指向一个特定的地址:https://ie.microsoft.com/legacy/。 这个网站远不止是一个简单的“皮肤

火狐浏览器有哪些设置功能
火狐浏览器有哪些设置功能

火狐浏览器五大核心设置功能:解锁高效、安全与个性化体验 火狐浏览器功能强大,但如果不仔细挖掘,很多能大幅提升效率和安全性的设置可能就“藏着掖着”了。这就好比拥有一台高性能设备,却只用了基础模式。那么,如何把它调整到最顺手、最安全的状态?接下来,我们就聚焦于当前版本(截至2025年末)最关键的五大设置

chrome搜索免验证入口
chrome搜索免验证入口

Chrome官方免验证入口为https://www.google.cn/chrome/,提供全平台安装包、免登录即用、本地化安全机制及引擎级性能优化。 到底该去哪里找正版、免费且无需繁琐验证的Chrome浏览器入口?这个问题困扰了不少网友。今天,我们就来直通核心,为大家详细拆解Chrome引擎的官方

java heap space 选型思路:使用场景与区别整理
java heap space 选型思路:使用场景与区别整理

Java堆是JVM存储对象的核心内存区域,配置需结合场景:单体应用适中设置;大数据处理需大堆并关注GC停顿;微服务强调快速启动;高并发需精细划分堆区域。关键参数-Xms和-Xmx建议等值以稳定性能。垃圾回收器选择影响效率,如G1适用于大堆,ZGC可实现低停顿。内存错误时需监控堆状态。

java heap space 使用中遇到的问题怎么解决
java heap space 使用中遇到的问题怎么解决

Java堆内存溢出错误通常因内存泄漏、数据处理需求过大或JVM参数配置不当引起。排查时可借助jmap、堆转储及MAT等工具定位问题。解决方案包括调整JVM内存参数(如-Xmx)、修复代码中的内存泄漏、优化大数据处理逻辑,并建立持续监控与预防机制,以保障应用稳定运行。

java xml 选型思路:使用场景与区别整理
java xml 选型思路:使用场景与区别整理

XML在Java开发中用于配置、数据交换等场景。解析方式主要有DOM、SAX、StAX及第三方库。DOM适合操作小文件,SAX/StAX适合处理大文件流,JAXB用于对象与XML映射。选型需结合数据大小、内存、性能及团队熟悉度,现代框架常封装底层解析。

using namespace 使用中遇到的问题怎么解决
using namespace 使用中遇到的问题怎么解决

命名空间的基本概念与常见引入问题在C++等编程语言中,命名空间(namespace)是一种将代码标识符(如变量、函数、类名)封装在特定名称下的机制,其主要目的是避免命名冲突,尤其是在大型项目或使用多个第三方库时。使用“using namespace”指令可以将指定命名空间中的所有名称引入当前作用域,

c语言函数递归 实操经验总结:这些技巧很实用
c语言函数递归 实操经验总结:这些技巧很实用

理解递归的基本原理在C语言中,递归是一种函数调用自身的编程技术。要掌握它,首先需要理解其核心思想:将一个复杂的大问题,分解为一个或几个与原问题相似但规模更小的子问题,直到子问题足够简单,可以直接求解。这个过程通常包含两个关键部分:递归出口和递归体。递归出口定义了问题何时不再继续分解,即最简单、可直接

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师
macOS

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

WINDOWS 更多
Windows 10
Windows 10
Windows

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘
Windows/macOS/iOS/Android

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。