Java 8 处理集合与时间总结

2,181 阅读3分钟

在开发中经常需要处理集合、时间,在使用java8之后可以更加优雅的实现,因此做了以下总结。

Java 8 处理集合

    @Data
    @AllArgsConstructor
    public class User{
        String name;
        String sex;
        Integer age;
    }
    
    List<User> list = Lists.newArrayList();
    list.add(new User("张三", "男", 18));
    list.add(new User("李四", "女", 18));
    list.add(new User("王五", "男", 19));
    list.add(new User("赵六", "女", 22));
    list.add(new User("李七", "男", 24));
## 1、遍历 List
    list.forEach(System.out::println);
    或者
    list.stream().forEach(a ->{
            System.out.println(a);
        });
    }
   
## 2、过滤某个属性成为一个新集合
   List<Student> manList = list.stream().filter(a -> Objects.equals(a.getSex, "男")).collect(Collectors.toList());
   
## 3、获取某个属性(姓名)成为一个新集合   
    List<String> nameList = list.stream().map(User::getName).collect(Collectors.toList());
    
## 4、去除某个属性相同的数据(去除年龄相同的对象)
    List<User> users = list.stream().collect(collectingAndThen(toCollection(() -> new TreeSet<>(comparingLong(User::getAge))), ArrayList::new));
 
## 5、按性别进行分组统计人数  
    Map<String, Integer> map = list.stream().collect(Collectors.groupingBy(User::getSex,Collectors.summingInt(p -> 1)));
 
## 6、判断某个属性(年龄)是否大于某值  
    boolean checkAge = list.stream().anyMatch(a -> a.getAge() > 19);
    
## 7、按照某个属性(年龄)排序
    List<User> sortByAge = list.stream().sorted((s1,s2)->s1.getAge().compareTo(s2.getAge())).collect(toList());

## 8、按照某个属性升序排序
    List<User> ascList = list.stream().sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList());
    
## 9、按照某个属性降序排序
    List<User> revList = list.stream().sorted(Comparator.comparing(User::getAge).reversed()).collect(Collectors.toList());
     
## 10、获取某个属性的最大值   
    long maxAge = list.stream().mapToLong(User::getAge).max().getAsLong();
    
## 11、获取某个属性的最小值
    long minAge = list.stream().mapToLong(User::getAge).min().getAsLong();
    
## 12、某个属性求和
    long sumAge = list.stream().mapToLong(User::getAge).sum();

## 13、过滤某个属性的数值相加
    Integer sumAge = list.stream().filter(a ->a.sex.equals("男")).mapToInt(a::geAge).sum();
    
## 14、获取集合指定前几个对象
    List<User> beforeTwo = sortByAge.stream().limit(2).collect(Collectors.toList());
    
## 15、List集合中去除重复元素
    ArrayList<User> collect = authResourcesOnes.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() ->
                new TreeSet<>(Comparator.comparing(o -> o.age()))), ArrayList::new));   
                
## 16、获取list中某属性的最大值的对象
Optional<DebateComment> max = redStars.stream().max(Comparator.comparingLong(DebateComment::getLikeNum));
DebateComment redStar = max.get();


Java 8 处理时间

    ##1、获取当前时间戳
    在旧的以前的方式中经常会使用 :  System.currentTimeMillis()
    使用Java 8 : Instant timestamp = Instant.now();
    
    ## 2、获取当前的年月日 
    ep:  LocalDate dateNow = LocalDate.now();   
    result:  2020-03-02
    
    同理 LocalDate 类还提供了获取年、月、日的Api
    int year = dateNow.getYear();                  //获取年    2020
    int monthValue = dateNow.etMonthValue();       //获取月    3
    int dayOfMonth = dateNow.getDayOfMonth();      //获取日    2
    
    ## 3、获取当前小时
    LocalTime localTime = LocalTime.now();
    System.out.println(localTime);       20:30
    
    ## 4、在现有的时间基础上 增 减 小时  
    LocalTime localTime = LocalTime.now();
    System.out.println(localTime);       20:30
    LocalTime newlocalTime = localTime.plusHours(2);//增加2小时
    System.out.println(newlocalTime);    22:30
    
    ## 5、判断二个日期是否相等  
    由于 LocalDate 重载了 equal 方法
    LocalDate dateNow = LocalDate.now();
    LocalDate date = LocalDate.of(2020, 03, 02);
    if(date.equals(dateNow)){
         System.out.println("二个日期属于同一天");
    }
    /*注意*/ :在比较对象是否相等的时候 推荐使用 java.util.Objects::equals() JDK7 引入的工具类
    源码:public static boolean equals(Object a, Object b) {
        // 可以避免空指针异常。如果a==null的话此时a.equals(b)就不会得到执行,避免出现空指针异常。
        return (a == b) || (a != null && a.equals(b));
    }
    
    ## 6、 比较二个日期的先后顺序
    LocalDate 类有两类方法isBefore()和isAfter()用于比较日期。调用isBefore()方法时,如果给定日期小于当前日期则返回 true
    
    LocalDate dateNow = LocalDate.now();
     LocalDate tomorrow = LocalDate.of(2020,03,03);
    if(tomorrow.isAfter(dateNow)){
        System.out.println("Tomorrow comes after today");
    }
    
    LocalDate yesterday = LocalDate.of(2020,03,01);
    if(yesterday.isBefore(now)){
        System.out.println("Yesterday is day before today");
    }
    
    ## 7、 Date 转换 LocalDate
    public class  dateChageLocalDate {
        public static void main(String[] args) {
            Date date = new Date();
            Instant instant = date.toInstant();
            ZoneId zoneId = ZoneId.systemDefault();
            // atZone()方法返回在指定时区从此Instant生成的ZonedDateTime。
            LocalDate localDate = instant.atZone(zoneId).toLocalDate();
            System.out.println("Date = " + date);
            System.out.println("LocalDate = " + localDate);
        }
    }
    
    ## 8、LocalDate 转换 Date
    public class localDateChageDate {
        public static void main(String[] args) {
            ZoneId zoneId = ZoneId.systemDefault();
            LocalDate localDate = LocalDate.now();
            ZonedDateTime zdt = localDate.atStartOfDay(zoneId);
            Date date = Date.from(zdt.toInstant());
            Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant())
            System.out.println("LocalDate = " + localDate);
            System.out.println("Date = " + date);
        }
    }

鄙人不才,在您面前献丑只愿与您结伴而行,文章若有不当之处,望大佬指点一二;如果我对您有帮助的话,还希望您能点赞分享,成长是一场苦涩的独自修行,我很需要您的陪伴与支持,这也是鄙人不断前行的根本动力,让我们在互相陪伴见证彼此生长的同时能够感染身边最亲近的人一同成长,鄙人在此叩谢!