我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java中不常用但很好用的开发小技巧分享

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java中不常用但很好用的开发小技巧分享

其实干 Java 开发,必然离不开一些计算,比如如果你现在工作是服务与银行,那么就会对金额这些计算非常敏感,所以就会经常用到 BigDecimal ,如果你入职的是其他行业的公司,可能用的就相对没这么多,今天了不起就来给大家分项一下那些不怎么常用,但是非常有用的方法。

BigDecimal

关于 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,因此避免了问题。

源码如下:

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<String> 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<Detail> 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<String, Long> map = userList.stream().collect(Collectors.groupingBy(User::getName, Collectors.counting()));
  //分组 Collectors.groupingBy(属性名)
 Map<Integer, List<Person>> map = list.stream().collect(Collectors.groupingBy(Person::getAge));
    //将名字全转换为大写
    List<String> list = userList.stream().map(User::getName).map(String::toUpperCase).collect(Collectors.toList());
    //获取忽略第一个并取前几条数据
    List<User> list1 = userList.stream().skip(1).limit(2).collect(Collectors.toList());
    //distinct() 去重;collect(Collectors.toList())。封装成集合
    List<User> collect = userList.stream().distinct().collect(Collectors.toList());

关于这些不常用,但是非常有用的内容,你学会了么?

到此这篇关于Java中不常用但很好用的开发小技巧分享的文章就介绍到这了,更多相关Java开发技巧内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java中不常用但很好用的开发小技巧分享

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java中不常用但很好用的开发小技巧分享

其实干Java开发,必然离不开一些计算,所以就会经常用到BigDecimal,今天小编就来给大家分项一下那些不怎么常用,但是非常有用的方法,需要的可以参考一下
2023-05-18

分享一些Java开发中的使用技巧

这篇文章给大家介绍分享一些Java开发中的使用技巧,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Web部分:脱离开各种语言,纯粹和 web相关的就是这些: HTML,CSS,JavaScript。哪怕你不用Java开发
2023-05-31

Android开发中常用的一些小技巧

Activity.startActivities() 常用于在应用程序中间启动其他的Activity. TextUtils.isEmpty() 简单的工具类,用于检测是否为空 Html.fromHtml() 用于生成一个Html,参数可以是
2022-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录