Java8代码特性

Java集合

判断所有集合内部的元素是否为空,使用isEmpty(),而不是size() == 0

原因:isEmpty()的可读性好,并且时间复杂度是O(1)

不要在foreach循环里进行元素的remove/add操作,remove元素使用Iterator方式,如果是并发操作,需要对Iterator对象加锁.

多个线程对一个集合的内容操作,就会产生 fail-fast (错误检测)机制,一旦检测到可能发生错误,就立马抛出异常,程序不继续往下执行.

解决方案:

使用Stream流中的filter过略

    List<String> userNames = new ArrayList<String>() {{
        add("Hollis");
        add("hollis");
        add("HollisChuang");
        add("H");
    }};

    userNames = userNames.stream().filter(userName -> !userName.equals("Hollis")).collect(Collectors.toList());
    System.out.println(userNames);

集合去重复 —> set

集合转数组 —> toArray(T[] array)

Integer [] myArray = { 1, 2, 3 };
List myList = Arrays.stream(myArray).collect(Collectors.toList());
//基本类型也可以实现转换(依赖boxed的装箱操作)
int [] myArray2 = { 1, 2, 3 };
List myList = Arrays.stream(myArray2).boxed().collect(Collectors.toList());

集合迭代

void lamndaFor() {
        List<String> strings = Arrays.asList("1", "2", "3");
        //传统foreach
        for (String s : strings) {
            System.out.println(s);
        }
        //Lambda foreach
        strings.forEach((s) -> System.out.println(s));
        //or
        strings.forEach(System.out::println);
     //map
        Map<Integer, String> map = new HashMap<>();
        map.forEach((k,v)->System.out.println(v));
}

Optional

解决 NPE 问题

Zoo zoo = getZoo();
if(zoo != null){
   Dog dog = zoo.getDog();
   if(dog != null){
      int age = dog.getAge();
      System.out.println(age);
   }
}
// 层层判空
Optional.ofNullable(zoo).map(o -> o.getDog()).map(d -> d.getAge()).ifPresent(age ->
    System.out.println(age)
);

ofNullable 方法和of方法唯一区别就是当 value 为 null 时,ofNullable 返回的是EMPTY,of 会抛出 NullPointerException 异常。如果需要把 NullPointerException 暴漏出来就用 of,否则就用 ofNullable

// 高频方法
Optional.ofNullable(zoo) // 创建一个可能为空的 Optional 对象,如果 zoo 为 null,则创建一个空的 Optional。
    .map(o -> o.getDog()) // 如果 zoo 存在,调用其 getDog() 方法获取 Dog 对象,否则跳过此步骤。
    .map(d -> d.getAge()) // 如果 Dog 对象存在,调用其 getAge() 方法获取 Dog 的年龄,否则跳过此步骤。
    .filter(v -> v == 1) // 如果年龄存在并且等于 1,则通过 filter 保留这个值,否则将其过滤掉。
    .orElse(3); // 如果之前的操作链中有任何一步为空或者不满足条件,最终返回默认值 3。

Date-Time API

解决:Date非线程安全、时区处理麻烦、各种格式化和时间计算繁琐、

public void newFormat(){
    //format yyyy-MM-dd
    LocalDate date = LocalDate.now();
    System.out.println(String.format("date format : %s", date));

    //format HH:mm:ss
    LocalTime time = LocalTime.now().withNano(0);
    System.out.println(String.format("time format : %s", time));

    //format yyyy-MM-dd HH:mm:ss
    LocalDateTime dateTime = LocalDateTime.now();
    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    System.out.println(String.format("dateTime format : %s", dateTimeStr));
}

字符串转日期格式

LocalDate date = LocalDate.of(2021, 1, 26);
LocalDate.parse("2021-01-26");

LocalDateTime dateTime = LocalDateTime.of(2021, 1, 26, 12, 12, 22);
LocalDateTime.parse("2021-01-26 12:12:22");

LocalTime time = LocalTime.of(12, 12, 22);
LocalTime.parse("12:12:22");

Java 8 之前 转换都需要借助 SimpleDateFormat 类,而Java 8 之后只需要 LocalDateLocalTimeLocalDateTimeofparse 方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值