jdk1.8新特性

对于流在工作中有用,对于接口中的default也常在jdk源码中看到,今天对它们做一个小小的总结,流在我之前的文章已经讲到过,故在这里不再介绍

1.接口中的默认方法

这个说起来很简单,就是让接口对方法有了默认的实现。用到的关键字是default。

public interface InterfaceDefault {
    
    String name ();
    
    default void hello () {
        System.out.println("nihao");
    }
}

1.1使用场景

我想重点是default的使用场景,假想,我们之前有一个接口,它有许多实现类,但是现在我想为它的每一实现类都加一个新的相同方法,那么没有default之前,我就得为每一个实现类写一个加上重复的方法,但是现在有了default ,我只需要在接口里加上这个默认实现了。

1.2与抽象类的区别

那么接口和抽象类还有什么区别勒,它们现在都是不可以直接实例化,都可以有方法实现,已经很像了。但是我想,它们核心区别还是出发点不同,接口是对行为的抽象,抽象类是对类的抽象。具体的小区别还有 接口不能有private/成员变量/构造器

2.Lambda

我们可以用Lambda来代替匿名内部类来简化编码,那么它是对匿名内部类的语法糖吗,lamdba确实是语法糖,但是不是匿名内部类的语法糖。
我们在排序,线程任务声名中常用到

new thread( () -> {
  //doSomeThing
}).start();

3.函数式接口

@FunctionalInterface
public interface InterfaceDefault {

    String one ();
    
    String two ();

    default void hello () {
        System.out.println("nihao");
    }
}

如上,我们如在一个类型上加了函数式接口注解,那么该接口 有且只有一个未实现的方法,故上面肯定是不行的。

3.1意义

最主要的意思当然是为了配合lamdba,当我们要实现一个函数式接口时,可以用lamdba来实现。当然,我们也可以用::,代表对象方法或者构造函数。如我们的Runable接口

@FunctionalInterface
public interface Runnable {
    /**
     * When an object implementing interface <code>Runnable</code> is used
     * to create a thread, starting the thread causes the object's
     * <code>run</code> method to be called in that separately executing
     * thread.
     * <p>
     * The general contract of the method <code>run</code> is that it may
     * take any action whatsoever.
     *
     * @see     java.lang.Thread#run()
     */
    public abstract void run();
}

4.时间api

总的来说,新的api是不可变且线程安全的,还提供了丰富的功能。

public class DataApi {


    public static void main(String[] args) {

        LocalDateTime nowTime = LocalDateTime.now();
        DateTimeFormatter formatter =  DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String time = formatter.format(nowTime);
        System.out.println(time);


        //格式化
        String timeStr = "2020-03-23 12:34:34";
        LocalDateTime localDateTime = LocalDateTime.parse(timeStr, formatter);
        String time1 = localDateTime.format(formatter);
        System.out.println(time1);

        //获取年月日
        System.out.println("当前月中的第" + localDateTime.getDayOfMonth() + "天");
        System.out.println("当前年中的第" + localDateTime.getDayOfYear() + "天");
        System.out.println("当前周中的" + localDateTime.getDayOfWeek());

        System.out.println("现在是" + localDateTime.getMonth());


        //获取差值
        Duration duration = Duration.between(localDateTime, nowTime);
        System.out.println("相差了" + duration.toDays() + "天");
        System.out.println("相差了" + duration.toHours() + "小时");


        //修改年月日 注意 这是返回新的对象
        localDateTime = localDateTime.plusYears(1);
        localDateTime = localDateTime.minusYears(3);
        System.out.println("现在是"+ localDateTime.getYear() + "年");
        localDateTime = localDateTime.withYear(2049);
        System.out.println("现在是"+ localDateTime.getYear() + "年");

        //使用TemporalAdjusters来实现一些计算 例如当前年第一天等
        LocalDateTime.now().with(firstDayOfYear());
        localDateTime.now().with(lastDayOfMonth());

		//Date与LocalDate的相互转化
		Instant instance = date.toInstant();
		ZoneId zoneId = ZoneId.systemDefault();
		LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zoneId);
		LocalDate localDate = localDateTime.toLocalDate();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值