Jdk1.8的新特性

目录

  1. 函数式接口和Lambda表达式
  2. 方法引用
  3. Stream流
  4. 新时间日期API

一、Lambda表达式

函数式接口中必须唯一有一个未实现的抽象方法,一般函数式接口建议添加注解@FunctionInterface,以下代码展示了jdk1.8的四大函数式接口和自定义接口

        /**
         * 消费型接口, 有参无返回值
         */
        Consumer<String> consumer = new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        };

        /**
         * 供给型接口, 无参有返回
         */
        Supplier<String> supplier = new Supplier<String>() {
            @Override
            public String get() {
                return new String("5");
            }
        };

        /**
         * 函数式接口, 有参有返回
         */
        Function<String, String> function = new Function<String, String>() {
            @Override
            public String apply(String s) {
                return s + "5";
            }
        };

        /**
         * 断言型接口, 有参有返回, 返回值类型为boolean类型
         */
        Predicate<String> predicate = new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s == "5";
            }
        };

自定义函数式接口示例

    /**
     * 自定义函数式接口
     * @param <T>
     */
    @FunctionalInterface
    public static interface MyPredicate<T> {
        boolean test(T t);
    }

Lambda表达式

        /**
         * 下面是Java中四大核心函数式接口使用Lambda创建实例的示例, Lambda表达式还有一些缩写规则, 详细规则请读者自行参考相关文档
         */
        Consumer<String> consumer = (s) -> {System.out.println(s);};
        Supplier<String> supplier = () -> {return "5";};
        Function<String, String> function = (s) -> {return s + "5";};
        Predicate<String> predicate = (s) -> {return s == "5";};

 

二、方法引用

        /**
         * 方法引用分类如下:
         * 1.对象::实例方法名
         * 2.类::静态方法名
         * 3.类::实例方法名(第一个参数调用方法, 第二个参数为第一个参数调用方法的参数)
         * 4.构造器引用
         * 5.数组引用
         */

        /**
         * 对象::实例方法名
         */
        Consumer<String> consumer = System.out::println;

        /**
         * 类::静态方法名
         */
        Predicate<String> predicate = Objects::isNull;

        /**
         * 类::实例方法名
         */
        BiFunction<String, String, Boolean> biFunction = String::equals;

        /**
         * 构造器引用
         */
        Supplier<String> supplier = String::new;

        /**
         * 数组引用
         */
        Function<Integer, String[]> function = String[]::new;

三、Stream流

流创建的API

        /**
         * List集合创建流
         */
        List<String> list = new ArrayList<>();
        Stream<String> stream1 = list.stream();

        /**
         * 数组创建流
         */
        String[] strArr = new String[10];
        Stream<String> stream2 = Arrays.stream(strArr);

        /**
         * 底层也是通过数组创建流
         */
        Stream<String> stream3 = Stream.of("a", "b", "c");

        /**
         * 创建无限流
         */
        Stream<Integer> stream4 = Stream.iterate(0, (s) -> s + 1);

        /**
         * 创建无限流
         */
        Stream<Double> stream5 = Stream.generate(() -> Math.random());

将流转化成集合和数组

        Stream<String> stream3 = Stream.of("a", "b", "c");
        /**
         * 将流转换成集合
         */
        List<String> list1 = stream3.collect(Collectors.toList());
        /**
         * 将流转换成数组
         */
        String[] strArr1 = stream3.toArray(String[]::new);

Stream流中间还有许多API操作, 具体详细API的使用请参考源码

四、新时间日期API

Jdk1.8新增了LocalDate, LocatTime和LocalDateTime, 三者的API几乎相同, 下面以LocalDateTime的简单使用进行介绍, 其他API使用请读者翻看源码(很详细的内部逻辑我自己还没有研究过,呲牙),

        /**
         * 获取当前日期实例, 同类API很多方法
         */
        LocalDateTime localDateTime = LocalDateTime.now();
        /**
         * 获取当前日期的年份, 获取月, 天, 时, 分, 秒等API操作类似
         */
        System.out.println("获取年: " + localDateTime.getYear());
        /**
         * 修改日期的年份, 修改月, 天, 时, 分, 秒等API操作类似
         */
        LocalDateTime localDateTime1 = localDateTime.minusYears(10);
        /**
         * 创建日期的解析格式
         */
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        /**
         * 解析字符串获取LocalDateTime对象实例
         */
        LocalDateTime localDateTime2 = LocalDateTime.parse("2020-10-12 12:12:12", dateTimeFormatter);
        System.out.println(LocalTime.parse("2020-10-12 12:12:12", dateTimeFormatter));
        /**
         * 将LocalDateTime对象按照指定格式格式化为字符串
         */
        System.out.println(dateTimeFormatter.format(localDateTime2));

此外, 据说jdk1.8接口新增了默认实现方法, 应该说这也是一个新特性吧, 更深层原理有待后续更新.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值