Java 8 新特性

2022/3/5 22:15:09

本文主要是介绍Java 8 新特性,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Java 8 新特性

Lambda

格式

  • -> Lambda 操作符 or 箭头操作符
  • -> 左边 lambda 形参列表 - 接口中的抽象方法的形参列表
  • -> 右边 lambda 方法体

Lambda 表达式的 本质,就是做为接口的实列,接口中只能有一个抽象方法,也叫函数式接口

image-20220122101152286

    @Test
    public void test1()  {

        Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.println(" 1 run() ... ");
            }
        };
        r.run();

        Runnable r1 = () -> System.out.println(" 2 run() ... ");
        r1.run();
    }

    @Test
    public void test2() {

        Comparator<Integer> c = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return Integer.compare(o1,o2);
            }
        };
        System.out.println(c.compare(1,2));

        Comparator<Integer> c1 = (o1,o2) -> Integer.compare(o1,o2);
        System.out.println(c1.compare(2,1));
    }

    @Test
    public void test3() {
        Consumer<String> c = s -> System.out.println(s);
        c.accept("HI Java ... ");
    }

函数式接口

java.util.function 包下定义 JDK 8 的 函数式接口

Consumer 消费型 void accept(T t)

Supplier 供给型 T get()

Function<T,R> 函数型 R apply(T t)

Predicate 断言型 boolean test(T t)

方法引用

方法引用,本质上就是 Lambda 表达式,而 Lambda 表达式 作为函数式接口的实例

方法引用 = 函数式接口的实例

使用场景:当要传递给 Lambda 体的操作,已经有实现方法了,可以使用方法引用;

格式:类 or 对象 ::方法名 System.out::println

对象::非静态 类::静态

    @Test
    public void test4() {

        /*
            Consumer -  void accept(T t)
            System.out - void println(T t)
         */
        Consumer<String> c = System.out::println;
        c.accept(" 方法引用 ");

        List<String> list = new ArrayList<>();
        list.add("张三");
        list.add("李四");

        /*
            Supplier - T get()
            List - String toString()
         */
        Supplier<String> s = () -> list.toString();
        System.out.println(s.get());

        Supplier<String> s1 = list::toString;
        System.out.println(s1.get());
        
        /*
            1 传入类型 2 返回类型
         */
        Function<Double,Long> f = Math::round;
        System.out.println(f.apply(5.0));
    }

要求:接口中的抽象方法的形参列表和返回值类型与方法应用方法的形参列表和返回值相同

类::非静态

    @Test
    public void test5() {

        /*
            Comparator - int compare(T t1,T t2)
            String - int t1.compareTo(t2)

            第一个参数 作为调用者
            第二个参数 传入者
         */
        Comparator<String> c = String::compareTo;
        c.compare("a","b");

        /*
            Bipredicate - boolean test(T t1,T t2)
            String - boolean t1.equest(t2)
         */
        BiPredicate<String,String> biPredicate = String::equals;
        biPredicate.test("a","b");

        /*
            第一个参数 做调用者
            Funcation - R apply(T t)

            String - String toString()

         */
        Function<String,String> f = String::toString;
        f.apply("Hi Java");
    }

构造器引用 和 数组引用

    @Test
    public void test6() {

        /*
            1 构造器引用
            2 数组引用
         */
         Supplier<ArrayList> supplier = ArrayList::new;
         System.out.println(supplier.get());

         Function<char[],String> f = String::new;
         System.out.println(f.apply(new char[]{'1','2','3'}));

         BiFunction<byte[],Integer,String> bif = String::new;
         System.out.println(bif.apply(new byte[16],16));

         Function<Integer,String[]> f2 = String[]::new;
         System.out.println(Arrays.toString(f2.apply(3)));
    }

Optional

java.util.Optional<T> 是一个容器类,可以避免空指针异常

Stream API

java.util.stream.Stream 对集合数据操作,一种高效的处理数据的方式,类似数据库查询;

image-20220122170552585

JDK 8 Collection 扩展了两个获取 Stream 的方法,1 顺序流 2 并行流

image-20220122170732331

image-20220122170747894

    @Test
    public void test1() { // Stream 方式一:通过集合
        // 顺序流
        Stream<User> stream = getList().stream();

        stream.skip(1) // 跳过几个元素,元素个数不足时 返回 空流 配合 limit(n) 使用
                .filter(o -> o.getAge() > 1) // 通过条件过滤
                .distinct() // 过滤 通过 hashCode 和 equest 元素去重
                .limit(3) // 截断流
                .forEach(System.out::println); // 终止操作


        // 并行流
        Stream<User> parallelStream = getList().parallelStream();
    }

使用java.util.Arrays.stream(T[] array)方法用数组创建流

int[] array={1,3,5,6,8};
IntStream stream = Arrays.stream(array);

使用Stream的静态方法:of()、iterate()、generate()

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);

Stream<Integer> stream2 = Stream.iterate(0, (x) -> x + 3).limit(4);
stream2.forEach(System.out::println);

Stream<Double> stream3 = Stream.generate(Math::random).limit(3);
stream3.forEach(System.out::println);

image-20220122170156123

image-20220122171126152

image-20220122171221464



这篇关于Java 8 新特性的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程