JDK8之初探索

本文深入探讨Java8的Lambda表达式、函数式接口、方法引用、Stream API、default方法及新的时间API,通过实例展示如何使代码更简洁优雅。

这几天研究了一下jdk8的新特性,给我的感觉要围绕Lambda表达式和函数式接口,然后将代码简化,变得优雅的一种处理方式。就目前来说,用得到的地方并不多,代

码虽然看起来优雅了,写得少了些,实际上准备的东西会多一些,然后就是能阅读性没有之前强,不过这些小问题只是前期不熟悉而已,写多了说不定就喜欢上了。

  1. Lambda表达式
  2. 函数式接口
  3. 方法引用
  4. Stream API
  5. default方法
  6. 新的时间API

一、lambda表达式

相信大家都用过内部匿名函数,通常为了在方法体内写入几行代码便要写很多准备工作,而且看起来很不优雅。

使用了lambda表达式之后,就变得更加优雅些,没有了枝叶,突出了重点,看到我们只关心的一部分。

下面是两个旧写法和lambda表达式的写法:

//匿名内部类的使用
   Runnable tradition = new Runnable() {
        @Override
        public void run() {
            System.out.println("tradition");
           }
   };
   tradition.run();
//优雅的lambda表达式的使用     
   Runnable lambdaRunnable = () -> System.out.println("lambdaRunnable");
   lambdaRunnable.run();

二、函数式接口

函数式接口必须具备以下两个特征:

1.具有唯一的抽象方法

2.有@FunctionalInterface注解修饰

注意:

1.接口内可以有静态方法、或者是default方法、或者是Object类的抽象方法

示例:

     

@FunctionalInterface
public interface FunctionalInterfaceTest
{
    //抽象方法
    int add(int a, int b);
    //default方法
    default int addOne(int a){
        return a+1;
    }
    //Object的抽象方法
    String toString();
    //静态方法
    static Object test(){
        return new Integer(0);
    }
}

PS:jdk内就有一堆函数式接口了。大家可以去查一下。

三、方法引用

给我的第一感觉是麻烦,限制较多,而且实际的作用也并不是大。

有几种形式:引用静态方法、引用对象方法、引用构造方法,还有一个是反射构建的,个人比较少用,不做介绍了。

首先是来一个接口Message

//具有泛型的接口
interface Message<P,R> {
 	R transFrom(P p);
}
    //引用静态方法,相当于实现了接口Message的唯一的抽象方法tranform.
    Message<String,Integer> message= Person::print;
    Integer value = message.transFrom("999");
    //使用对象方法,相当于实现了接口Message的唯一的抽象方法tranform.
    String content = "jdk1.8";
    Message <Integer,String> message1 = content::substring;
    String result = message1.transFrom(1);
    //在User类中找到一个参数对应为String,Integer的构造方法
    BiFunction<String, Integer, User> biFunction = User::new;
    User person = biFunction.apply("mengday", 28);
@Data
@Component
public class User {
    Integer password;
    String name;
    public User(){
    }
    //引用方法就就是找到这个构造方法进行构造
    public User(String name,Integer password)
    {
        this.name = name;
        this.password = password;
    }
}

 

总结一下:引用方法,用其他方法 来实现 接口中的方法。

四、Stream API 

这是个好东西,特别是应用在集合类上面,集合的操作Stream API 基本都是可以,而且写起来很简洁,是使用lambda表达式操作的,看起来很舒服。

下面这篇写得特别好,我就不在这班门弄斧了。

https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/

五、default方法

      jdk1.8之前规定接口只允许有抽象方法,不允许有方法体。有一天该接口需要增加新的功能,该怎么办呢?在接口添加抽象方法,然后在实现类中在实现?显然不现实,毕竟实现类有这么多。所以就推出了default方法可以在接口中写具体的方法体。


public interface A {
	public default void a(){
		System.out.println("这是A");
	}
}

六、新的时间API

我想有新的time Api出现,就意味着旧的有他的缺陷。于是我查了一下,有这三个问题:非线程安全、设计复杂化、时区处理麻烦。这三个问题真的要命,相信也是各位的疼。

Java8的java.time包下有很多新的API处理时间,主要是这两个:Local、Zoned;

Local示例:

    public static void main(String[] args) {
        //获取当前的日期时间
        LocalDateTime currentTime = LocalDateTime.now();
        System.out.println("当前时间:" + currentTime);

        LocalDate date1 = currentTime.toLocalDate();
        System.out.println();

        Month month = currentTime.getMonth();
        int day = currentTime.getDayOfMonth();
        int seconds = currentTime.getSecond();
        System.out.println("月: " + month +", 日: " + day +", 秒: " + seconds);

        // 12 december 2019
        LocalDate date3 = LocalDate.of(2019, Month.DECEMBER, 12);
        System.out.println("date3: " + date3);

        // 15 小时 46 分钟
        LocalTime date4 = LocalTime.of(15, 46);
        System.out.println("date4: " + date4);

        // 解析字符串
        LocalTime date5 = LocalTime.parse("17:49:53");
        System.out.println("date5: " + date5);
    }

 

Zoned示例:

    public static void main(String[] args) {       
         testZonedDateTime();
    }
    public static void testZonedDateTime(){

        // 获取当前时间日期
        ZonedDateTime date1 = ZonedDateTime.parse("2015-12-03T10:15:30+05:30[Asia/Shanghai]");
        System.out.println("date1: " + date1);

        ZoneId id = ZoneId.of("Europe/Paris");
        System.out.println("ZoneId: " + id);

        ZoneId currentZone = ZoneId.systemDefault();
        System.out.println("当期时区: " + currentZone);
    }

 

 

 

 

 

 

 

 

 

先看效果: https://renmaiwang.cn/s/jkhfz Hue系列产品将具备高度的个性化定制能力,并且借助内置红、蓝、绿三原色LED的灯泡,能够混合生成1600万种不同色彩的灯光。 整个操作流程完全由安装于iPhone上的应用程序进行管理。 这一创新举措为智能照明控制领域带来了新的启示,国内相关领域的从业者也积极投身于相关研究。 鉴于Hue产品采用WiFi无线连接方式,而国内WiFi网络尚未全面覆盖,本研究选择应用更为普及的蓝牙技术,通过手机蓝牙与单片机进行数据交互,进而产生可调节占空比的PWM信号,以此来控制LED驱动电路,实现LED的调光功能以及DIY调色方案。 本文重点阐述了一种基于手机蓝牙通信的LED灯设计方案,该方案受到飞利浦Hue智能灯泡的启发,但考虑到国内WiFi网络的覆盖限制,故而选用更为通用的蓝牙技术。 以下为相关技术细节的详尽介绍:1. **智能照明控制系统**:智能照明控制系统允许用户借助手机应用程序实现远程控制照明设备,提供个性化的调光及色彩调整功能。 飞利浦Hue作为行业领先者,通过红、蓝、绿三原色LED的混合,能够呈现1600万种颜色,实现了全面的定制化体验。 2. **蓝牙通信技术**:蓝牙技术是一种低成本、短距离的无线传输方案,工作于2.4GHz ISM频段,具备即插即用和强抗干扰能力。 蓝牙协议栈由硬件层和软件层构成,提供通用访问Profile、服务发现应用Profile以及串口Profiles等丰富功能,确保不同设备间的良好互操作性。 3. **脉冲宽度调制调光**:脉冲宽度调制(PWM)是一种高效能的调光方式,通过调节脉冲宽度来控制LED的亮度。 当PWM频率超过200Hz时,人眼无法察觉明显的闪烁现象。 占空比指的...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值