Maps.newHashMap与new HashMap的区别

(1)Map<String, Object> result = new HashMap<String,Object>();     这种是java原生API写法,需要你手动加泛型。(2)Map<String, Object> result = Maps.newHashMap();     这种是google的guava.jar提供的写法,目的是为了简化代码,不需要你手动写泛型。

利用BeanMap将实体类对象与Map进行相互转换

虽然通过反射也可以,但是可能稍微有点麻烦,如何将实体对象快速转换成Map呢?接下来使用net.sf.cglib.beans.BeanMap类中方法进行转换People people = new People();people.setName("葬爱");people.setAge(18);BeanMap beanMap = BeanMap.create(people);System.out.println(beanMap); //输出 {name=葬爱, age=18}Map beanMap1 = beanMap;System.out.println(beanMap1);//输出 {name=葬爱, age=18}HashMap<Object, Object> map = new HashMap<>();map.put("name","韩梅梅");map.put("age",17);map.put("sex","felman");beanMap.putAll(map);System.out.println(beanMap); //{name=韩梅梅, age=17}People bean = (People) beanMap.getBean();System.out.println(bean);//People{name='韩梅梅', age=17}

BigDecimal使用与"Non-terminating decimal expansion; no exact representable decimal result"错误解决

BigDecimal类数据的处理和"Non-terminating decimal expansion; no exact representable decimal result"问题原因很简单,因为BigDecimal高精度表示的数字是无限小数,因此会报如上错误,因此对其保留小数点后多少位即可。BigDecimal num1 = new BigDecimal("10");BigDecimal num2 = new BigDecimal("3");BigDecimal num3 = num1.divide(num2);其实devide的函数定义如下BigDecimal.divide(BigDecimal divisor, int scale, RoundingMode roundingMode) ;scale为小数位数;roundingMode为小数模式,模式如下:ROUND_CEILING 如果 BigDecimal 是正的,则做 ROUND_UP 操作;如果为负,则做 ROUND_DOWN 操作。 ROUND_DOWN 从不在舍弃(即截断)的小数之前增加数字。 ROUND_FLOOR 如果 BigDecimal 为正,则作 ROUND_UP ;如果为负,则作 ROUND_DOWN 。 ROUND_HALF_DOWN 若舍弃部分> .5,则作 ROUND_UP;否则,作 ROUND_DOWN 。 ROUND_HALF_EVEN 如果舍弃部分左边的数字为奇数,则作 ROUND_HALF_UP ;如果它为偶数,则作 ROUND_HALF_DOWN 。 ROUND_HALF_UP 若舍弃部分>=.5,则作 ROUND_UP ;否则,作 ROUND_DOWN 。 ROUND_UNNECESSARY 该“伪舍入模式”实际是指明所要求的操作必须是精确的,,因此不需要舍入操作。 ROUND_UP 总是在非 0 舍弃小数(即截断)之前增加数字。写成如下便可通过BigDecimal num3 = num1.divide(num2,10,RoundingMode.ROUND_CEILING);其他用法,这种用法适合两数相除是有限小数,无限小数仍会报以上错误BigDecimal num3 = num1.divide(num2).setScale(2, BigDecimal.ROUND_HALF_UP);参考链接:https://blog.csdn.net/roc1029/article/details/12871143

DecimalFormat的使用

double pi = Math.PI;// 整数位多则正常显示 不足则填充0 小数位多则截取 System.out.println(new DecimalFormat("0.00").format(pi)); //3.14 System.out.println(new DecimalFormat("000.00").format(pi)); //003.14// #功能同上 但对于小数结尾或整数开头的0会不予显示 System.out.println(new DecimalFormat("###.##").format(pi));//3.14// 如下小数保留2位 但3.1后0可省略 System.out.println(new DecimalFormat("###.##").format(3.100));//3.1// 0不能省略,因为小数末尾6四舍五入成了3.11 System.out.println(new DecimalFormat("###.##").format(3.106));//3.11// %号会将数值成100显示 System.out.println(new DecimalFormat("#.##%").format(pi));//314.16%// ‰号会将数值成1000显示 System.out.println(new DecimalFormat("00.00‰").format(pi));//3141.59‰// -取负数 System.out.println(new DecimalFormat("-0.00").format(pi));//-3.14// E指数 System.out.println(new DecimalFormat("00.00E0").format(123456789012345678L));//12.35E16// #号使用在指数中直接省去整数位 System.out.println(new DecimalFormat("#E0").format(123));//.1E3 System.out.println(new DecimalFormat("0E0").format(123));//1E2// 0要在#后面 0保证了位数 System.out.println(new DecimalFormat("#####00000").format(123));//00123// ¤表示金额格式 一个¤代表一个符号 但连续的代表货币国际符号 System.out.println(new DecimalFormat(",000.00¤").format(1234567890));//1,234,567,890.00¥ System.out.println(new DecimalFormat(",000.00¤¤").format(1234567890));//1,234,567,890.00CNY// ''类似字符模板 System.out.println(new DecimalFormat("‘你好’000").format(12));//‘你好’012 System.out.println(new DecimalFormat("‘你0好’000").format(12));//‘你0012好’以上只是些简单用法,更多请

Vert.x的介绍!目前最快的Java框架?

官网:https://vertx.io/download/Vert.x是一个多语言Web框架,它支持Java,Kotlin,Scala,Ruby和Javascript支持的语言之间的共同功能。无论语言如何,Vert.x都在Java虚拟机(JVM)上运行。模块化和轻量级,它面向微服务开发。如果你开发的是一个高并发的系统,那我建议Vert.X是优先之选。Vert.X强的地方在于它的方法论。多处理器、高并发的需求,多数人都知道是要处理好同步、资源竞争、线程调度的问题。少部分人意识到异步是解决高并发的良好方案,但依然不够解决问题。只有在Akka/Actor这类方案出来之后,异步IO框架才逐渐认识到解决同步、资源竞争、线程调度的最好方法就是让它干脆不要出现。而在所有这类方案中,Vert.X是决心最大动作最彻底的。别的方案主要是基本核心等其他人扩充,Vert.X几乎是全家桶。举个例子,拿Vert.X和异步高并发界的知名前辈Nginx比较:Nginx大思路主要采用单线程模型,但是在会话秘钥等方面还是会需要内存共享。所以Nginx提供了专门的函数来处理共享内存,以及严禁复杂内存对象的共享。假如你在上面做研发,有些需求就没法实现。Vert.X则是从解决这个问题的思路就开始了重构,不是怎么去做内存共享,而是怎么让这个内存对象的访问都集中到同一线程,让内存共享的问题根本不出现。所以出现类似的情况,极少有需求用Vert.X不能实现,多半都是你没按照它的思路来理解问题。Vert.X的另外一个优点是,它没有象以前的NIO框架那样整出一套与常规编程逻辑大不相同的规范,它着力构造的是系统本身的运作方式,但尽量少干扰应用的编写。也就是说程序员需要学习的主要是解题思路,而不是解题写法。作者:海叔链接:https://www.zhihu.com/question/277219881/answer/1026585089来源:知乎

SpringDataJpa复合主键写法

方式一复合主键类@Embeddablepublic class UserKey implements Serializable {    @Column(name = "NAME", nullable = false, length = 32)    private String name;    @Column(name = "AGE", nullable = true, length = 32)    private String age;        getter/setter...}实体类@Entity@Table(name = "USER")@IdClass(UserKey.class)public class User implements Serializable {    /**      * serialVersionUID     */ private static final long serialVersionUID = -7768637914227571159L;    /**      * 物料编码     */ @Id @Column(name = "NAME", nullable = true, length = 32)    private String name;        /**      * 技术规范书编码     */ @Id @Column(name = "AGE", nullable = true, length = 32)    private String age;    getter/setter    }查找方法userRepository.findOne(userKey);参考:https://www.cnblogs.com/boywwj/p/8031106.html方式二复合主键不能用@Id,需要用@EmbeddedId主键类@Embeddablepublic class UserFundPrimarykey implements Serializable { private static final long serialVersionUID = 1L;  //用户ID private Integer userId; private String date; getter/setter...}实体类@Entity@Table(name = "user_funds")public class UserFund { /** * 主键 * 复合主键不能用@Id,需要用@EmbeddedId。插入数据的时候必须手工赋值 */ @EmbeddedId private UserFundPrimarykey userFundPK; //本金 @Column(precision=18, scale=5) private BigDecimal principal; //利率(5%传0.05) @Column(precision=18, scale=5) private BigDecimal rate; /** * 当天收益(日利息=本金*利率/365) * 保留2位小数 */ @Column(precision=18, scale=2) private BigDecimal interest; getter/setter...}持久层public interface UserFundRepository extends CrudRepository<UserFund, UserFundPrimarykey> {}设值使用UserFund uf2 = new UserFund();//必须手动设置主键uf2.setUserFundPK(new UserFundPrimarykey(2, "2017-07-01"));uf2.setRate(new BigDecimal("0.041"));uf2.setPrincipal(new BigDecimal("20000"));//截断,只保留两位小数uf2.setInterest(uf2.getRate().multiply(uf2.getPrincipal()).divide(new BigDecimal("365"), 2, RoundingMode.DOWN));userFundRepository.save(uf2);参考:https://blog.csdn.net/mn960mn/article/details/74034512

国内高速JDK下载镜像地址

如今,jdk8及以上版本jdk下载都需要登录才能下载了,可能是减少不必要的服务器开销吧,但是每次在配置环境下载jdk的时候未免有点麻烦,因此给大家带来几个不用登录并且是国内的jdk下载网站。OpenJDK:https://mirrors.tuna.tsinghua.edu.cn/AdoptOpenJDK/编程宝库:JDK下载 - 编程宝库华为:Index of java-local/jdkINJDK:Java I tell you-爪哇我话你知liferay(国外):Index of /mirrors/download.oracle.com/otn-pub/java/jdk

最新阿里巴巴开发规范及开发手册下载

github托管:https://github.com/alibaba/p3c 例如1.5版本的Java开发手册:https://raw.githubusercontent.com/alibaba/p3c/master/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4Java%E5%BC%80%E5%8F%91%E6%89%8B%E5%86%8C%EF%BC%88%E5%8D%8E%E5%B1%B1%E7%89%88%EF%BC%89.pdf

Java日志使用如何避免字符拼接及注意事项

场景:String os="macOS";//不推荐,在不符合该日志级别范围内字符串拼接操作还会执行会影响性能logger.debug("系统"+os); //改写成{}占位符的懒求值方式,建议此操作logger.debug("系统{}", os);遇到如下情况又是一次拼接或者是调用一个方法该咋办呢logger.debug("系统{}", "平台:"+os);logger.debug("系统{}", toJson(os));在之前介绍lamada的帖子里(Lamada学习小记)用Lambda延迟加载来避免日志log的字符拼接。借助万能的lamada吧!logger.debug("系统{}", () -> ("平台:"+os));logger.debug("系统{}", () -> toJson(os));把它还原成匿名内部类的形式会发现logger.info("系统{}",        new Supplier<Object>() {            @Override            public Object get() {                return ("平台:" + os);            }        });其中java.util.function.Supplier<T> 接口仅包含一个无参的方法: T get() 。用来获取一个泛型参数指定类型的对象数据。由于这是一个函数式接口,这也就意味着对应的Lambda表达式需要“对外提供”一个符合泛型类型的对象数据。

新奇的Java模板、持久层工具包Beetl

    Beetl是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,超过当前流行的模板引擎。而且还易学易用。    BeetSql是一个全功能DAO工具, 同时具有Hibernate 优点 & Mybatis优点功能,适用于承认以SQL为中心,同时又需求工具能自动能生成大量常用的SQL的应用。官网:http://ibeetl.com/