Java8新特性及常用方法

 集合 Stream流

(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());

 (7) 分组聚合 count,类似于 mysql group by count

 Map<Long, Long> map = list.stream().collect(Collectors.groupingBy(Bean::getId, Collectors.counting()));

 

时间:

不变性:新的日期/时间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());

Default:

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

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

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

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

原文地址:https://www.cnblogs.com/pzyin/p/7994479.html