Java8新特性及常用方法

default:

研究了一下架构师的代码, 发现有一个接口是这样实现的:

业务上对接了淘宝,天猫,京东,有赞等商城平台,且有一套规范的接口流程,每对接一个平台都可继承此接口,但有些商城开放平台并不提供指定单号抓取的接口,所以问题来了:

default JSONObject getOrderById(String extOrderId) throws Exception {
   throw new ServiceException(ServiceCodeDefinition.NOT_SUPPORT_ACTION, "该平台不支持按订单号抓取订单");
};

当时就眼前一亮,研究了一波之后发现,这是java8新增的新特性,主要的优点就是当你接口中新增一个用default修饰的方法之后可以不必在其实现类中新增其实现,但是必须要在接口中给一个默认的实现.有类似一个接口有多个实现的时候就可以灵活来处理业务流程,这是java8一个非常不错的改进.当然,如果有一个类实现了多个接口,并且实现的多个接口中有两个以上的default方法,那么就会编译报错.这个请多加注意.

 

集合

(1)分组(比如说某个pojo的某个字段的集合):

List<SysOperatorLogsBean> logsBeans = logsMongoEngine.getBeans(sql);

List<Long> tenantIds = logsBeans.stream().map(SysOperatorLogsBean::getTenantId).distinct().collect(Collectors.toList()); 

(2)求和操作:

List<Order> orderList = orderDao.findOrdersByUid(user.getUid());

orderList.stream().mapToDouble(Order::getMoney).sum();

(3)list转化为map:

Map<String, HandicapDto> collect = dtos.stream().collect(Collectors.toMap(HandicapDto::getBetCodes, (p) -> p));

(4)将对象转为集合

Collections.singletonList(user)

(5)将数组转为集合

Integer[] arrs = new Integer[]{};

Set<Integer> values = new HashSet<>(Arrays.asList(arrs));

 (6) 排序

Set<User> result = firstUsers.stream().sorted(Comparator.comparing(User::getCreateTime).reversed()).collect(toList());

 

 

 

时间:

不变性:新的日期/时间API中,所有的类都是不可变的,这对多线程环境有好处。

关注点分离:新的API将人可读的日期时间和机器时间(unix timestamp)明确分离,它为日期(Date)、时间(Time)、日期时间(DateTime)、时间戳(unix timestamp)以及时区定义了不同的类。

清晰:在所有的类中,方法都被明确定义用以完成相同的行为。举个例子,要拿到当前实例我们可以使用now()方法,在所有的类中都定义了format()和parse()方法,而不是像以前那样专门有一个独立的类。为了更好的处理问题,所有的类都使用了工厂模式和策略模式,一旦你使用了其中某个类的方法,与其他类协同工作并不困难。

实用操作:所有新的日期/时间API类都实现了一系列方法用以完成通用的任务,如:加、减、格式化、解析、从日期/时间中提取单独部分,等等。

可扩展性:新的日期/时间API是工作在ISO-8601日历系统上的,但我们也可以将其应用在非ISO的日历上。

 

 

(1)格式化yyyy-MM-dd 的时间入参,默认表示今天,最终获得Date (这段不是新特性,但蛮常用的): 

Date startDate = StringUtils.isEmpty(start) ?
                DateUtils.truncate(new Date(), Calendar.DAY_OF_MONTH) :
            DateUtils.parseDate(start, "yyyy-MM-dd");

Date endDate = StringUtils.isEmpty(end) ?
           endDate = new Date() :
           DateUtils.addDays(DateUtils.parseDate(end, "yyyy-MM-dd"), 1);

 

(2)可以获取当日的0点。连续操作 +  -   时分秒以及天数:

Date now = Date.from(LocalDate.now().atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()); 

 

(3)求本月第一天和最后一天

LocalDate today = LocalDate.now();

LocalDate firstday = LocalDate.of(today.getYear(),today.getMonth(),1);

LocalDate lastDay =today.with(TemporalAdjusters.lastDayOfMonth());

转载于:https://www.cnblogs.com/pzyin/p/7994479.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值