java8新特性

 

 

/**
     * 【接口中 默认方法 有方法体】
     *      JDK8之前,接口中可以定义 变量、方法:
     *          变量 必须 为 public static final修饰
     *          方法 必须 为 public abstract 修饰
     *
     *      JDK8及以后,接口中可以定义 普通方法(有方法体)
     *          default
     *          static
     *
     */
    interface MyJDK8{

        void test1();

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

        static void test3(){
            System.out.println("test3...");
        }

    }

    class MyJDK8Impl implements MyJDK8{
        @Override
        public void test1() {
            System.out.println("test1...");
        }
    }

  

/**
     * 【lambda表达式】
     *      why?
     *          期望 使用 接口的方法:
     *              a,写一个class 实现接口;
     *              b,使用匿名内部类;
     *      好处:
     *          简化 匿名内部类的调用;
     *
     *      How?
     *          使用 lambda表达式 依赖于 函数式接口;
     *
     *          【函数式接口】
     *              what?
     *                 接口 只有 一个 抽象方法,可以 认为该接口是 函数式接口,可以用 @FunctionalInterface 标识
     *              规范:
     *                  函数式接口中 允许 重新 Object方法;
     *                  函数式接口中 允许 default、static方法;
     *
     *       语法:
     *          () :参数列表
     *          -> :分隔符
     *          {}  :方法体
     *
     *        使用:
     *           a, 无参
     *           b, 有参
     *
     */
    interface MyLambda{
        void test();
    }

    void testInterfaceMethod(){

        // 使用匿名内部类
        new MyLambda(){
            @Override
            public void test() {
                System.out.println("test...");
            }
        }.test();

        // 使用lambda
        ((MyLambda) () -> System.out.println("test...")).test();
    }

    @FunctionalInterface
    interface MyFuncInterface{

        // 唯一 抽象方法
        void test();

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

        static void test2(){
            System.out.println("test2...");
        }

        // Object 方法
        String toString();
    }

    void testMyFuncInterface(){
        MyFuncInterface m = () -> System.out.println("aa");
        m.test();

        // 简化
        ((MyFuncInterface) () -> System.out.println("aa")).test();
    }

    @FunctionalInterface
    interface MyFuncInterface1{
        String test(String a, String b);
    }

    void testMyFuncInterface1(){
        MyFuncInterface1 m = (a, b) -> {
            return a + ":" + b;
        };
        m.test("a", "b");

        // 简化
        MyFuncInterface1 m1 = (a, b) -> a + ":" + b;

        ((MyFuncInterface1) (a, b) -> a + ":" + b).test("aaaa", "bbbbb");

    }

  

/**
     * 【Stream】
     *      基于 pipeline 设计:
     *          数据源 => pipeline(过滤 | 排序...执行器) => 结果数据
     *               (每个 执行器 都会生成一个新的pipeline)
     *               (生成新的pipeline后,老的将不会存在)
     *
     *      特性:
     *          a, stream不存储数据,变量都在局部变量;
     *          b, 数据源不会变化;
     *          c, stream不可以重复使用;
     *
     *      stream的3种操作:
     *          a,生成初始stream
     *          b,中间操作
     *              返回一个stream
     *              可以多个
     *          c,终值操作
     *              仅有一个
     *
     *      stream的执行顺序:
     *          每条数据 按pipeline的流程 依次执行;
     *              eg:pipeline: a-b
     *                  第一条数据 -a-b-
     *                  第二条数据 -a-b-
     *
     *      JDK自带的函数式接口:
     *
     *      方法引用:
     *          结合 lambda表达式, 让代码 更加精简;
     *
     *          种类:
     *              static方法引用: 类名::static方法
     *              对象方法引用: 类名::实例方法
     *              实例方法引用: new 对象::实例方法
     *              构造函数引用: 类名::new
     *
     */

    /**
     * 【stream的3种操作】
     */

    /**
     * 初始stream
     */
    void initStream(){
        Stream<String> stringStream = Stream.of("a", "b");

        IntStream intStream = Arrays.stream(new int[]{1, 3});

    }

    /**
     * 中间操作
     */
    void middleStream(){
        Arrays.asList("a", "b").stream()
                .filter(a->{
                    System.out.println("aa");
                    return a.equals("aa");
                }
                );
    }

    /**
     * 终值操作
     */
    void finalStream(){
        Arrays.asList("a", "b").stream().filter(a->{
            System.out.println("aa");
            return a.equals("aa");
        }).count();
    }

    class Person{

        Person(){

        }

        Person(String name, Integer age){
            this.name = name;
            this.age = age;
        }

        String name;
        Integer age;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Integer getAge() {
            return age;
        }

        public void setAge(Integer age) {
            this.age = age;
        }

        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }

    void testStream(){
        Person person = new Person("1", 1);
        Person person1 = new Person("2", 2);

        // 【转Set】
        Set<Person> set = Arrays.asList(person, person1)
                .stream()
                .collect(Collectors.toSet());

        // 【转map】
        Map<String, Integer> map = Arrays.asList(person, person1)
                .stream()
                .collect(Collectors.toMap(
                        new Function<Person, String>() {
                            @Override
                            public String apply(Person person) {
                                return person.getName();
                            }
                        },
                        new Function<Person, Integer>() {
                            @Override
                            public Integer apply(Person person) {
                                return person.getAge();
                            }
                        }

                        ));

        // 简化
        Map<String, Integer> map1 = Arrays.asList(person, person1)
                .stream()
                .collect(Collectors.toMap(p -> p.getName(), p -> p.getAge()));

        System.out.println(map1);

        // 【求和】
        Person countPerson = Arrays.asList(person, person1)
                .stream()
                .reduce(new BinaryOperator<Person>() {
                    @Override
                    public Person apply(Person person, Person person2) {
                        Person p = new Person();
                        p.setAge(person.getAge() + person2.getAge());
                        return p;
                    }
                })
                .get();

        // 简化
        Person countPerson1 = Arrays.asList(person, person1)
                .stream()
                .reduce((p1, p2) -> {
                    Person p = new Person();
                    p.setAge(p1.getAge() + p2.getAge());
                    return p;
                })
                .get();
        System.out.println(countPerson1.getAge());

        // 【max || min】
        Person maxPerson = Arrays.asList(person, person1)
                .stream()
                .max(new Comparator<Person>() {
                    @Override
                    public int compare(Person o1, Person o2) {
                        return o1.getAge() - o2.getAge();
                    }
                })
                .get();
        // 简化
        Person maxPerson1 = Arrays.asList(person, person1)
                .stream()
                .max((p1, p2) -> p1.getAge() - p2.getAge())
                .get();

        System.out.println(maxPerson1.getAge());

        // 【match】
        boolean match = Arrays.asList(person, person1)
                .stream()
                .anyMatch(new Predicate<Person>() {
                    @Override
                    public boolean test(Person person) {
                        return person.getName().equals("jack");
                    }
                });

        // 简化
        boolean match1 = Arrays.asList(person, person1)
                .stream()
                .anyMatch(p -> p.getName().equals("jack"));
        System.out.println(match1);

        // 【Filter】
        Set<Person> filter1 = Arrays.asList(person, person1)
                .stream()
                .filter(new Predicate<Person>() {
                    @Override
                    public boolean test(Person person) {
                        return person.getName().equals("jack");
                    }
                })
                .collect(Collectors.toSet());
        // 简化
        Set<Person> filter2 = Arrays.asList(person, person1)
                .stream()
                .filter(p -> p.getName().equals("jack"))
                .collect(Collectors.toSet());
        System.out.println(filter2);

        // 【分页】
        Set<Person> limit1 = Arrays.asList(person, person1)
                .stream()
                .skip(0)
                .limit(3)
                .collect(Collectors.toSet());
        System.out.println(limit1);

        // 【排序】
        Set<Person> sort = Arrays.asList(person, person1)
                .stream()
                .sorted(new Comparator<Person>() {
                    @Override
                    public int compare(Person o1, Person o2) {
                        return o2.getAge() - o1.getAge();
                    }
                })
                .collect(Collectors.toSet());

        // 简化
        Set<Person> sort1 = Arrays.asList(person, person1)
                .stream()
                .sorted((p1, p2) -> p2.getAge() - p1.getAge())
                .collect(Collectors.toSet());
        System.out.println(sort1);

    }

  

posted on 2021-11-22 16:52  anpeiyong  阅读(12)  评论(0编辑  收藏  举报

导航