zoukankan      html  css  js  c++  java
  • 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方法,那么就会编译报错.这个请多加注意.

  • 相关阅读:
    Find the Smallest K Elements in an Array
    Count of Smaller Number
    Number of Inversion Couple
    Delete False Elements
    Sort Array
    Tree Diameter
    Segment Tree Implementation
    Java Programming Mock Tests
    zz Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)
    Algorithm about SubArrays & SubStrings
  • 原文地址:https://www.cnblogs.com/pzyin/p/7994479.html
Copyright © 2011-2022 走看看