美文网首页
2019-06-19 java8新特新Lambda表达式

2019-06-19 java8新特新Lambda表达式

作者: 惜小八 | 来源:发表于2019-06-19 18:13 被阅读0次

    1.接口的默认方法

    1.在java1.8之前

    在java1.8之前java当中接口里面的方法默认都是public abstract修饰的抽象方法并且没有方法体

    2.static方法

    java8可以在接口当中定义static接口,要求如下
    1.使用static修饰接口当中的方法,方法必须要有方法体
    2.接口当中的static方法只能通过:接口名.方法名   调用
    3.接口的static方法不能被子接口继承
    4.接口的static方法不能被实现类复写和直接调用
    
    package com.imooc.lamda.bean;
    public interface MyInterface {
        void test();
        /**
         * java8新特性:在接口当中可以使用static修饰方法,不过此方法必须要有方法体
         */
        public static void staticMethod() { 
            System.out.println("Interface当中的static方法...");
        }
    }
    *******************************************************************************************
    package com.imooc.lamda.bean;
    public class Test {
    
        public static void main(String[] args) {
            
            MyInterface.staticMethod();
        }
    }
    

    3.default方法

    接口当中的default方法必须要有方法体

    1.接口当中的default方法可以被实现类继承
    package com.imooc.default1.bean;
    
    public interface MyInterface1 {
    
        public abstract void test();
        
        default void defaultMethod() {
            
            System.out.println("这是defaultMethod...");
        }
    }
    ***************************************************************************************************
    package com.imooc.default1.bean;
    
    public class MyInterface1Impl implements MyInterface1 {
    
        @Override
        public void test() {
    
        }
        //接口当中的default方法是默认继承的,要想重写可以显示的Override
    }
    ***************************************************************************************************
    package com.imooc.default1.bean;
    
    public class Test {
        public static void main(String[] args) {
            
            MyInterface1Impl myInterface1Impl=new MyInterface1Impl();
            
            myInterface1Impl.defaultMethod();//这是defaultMethod...
        }
    }
    
    
    2.接口当中的default方法可以被子接口继承
    package com.imooc.default1.bean;
    
    public interface MyInterface1 {
    
        public abstract void test();
        
        default void defaultMethod() {
            
            System.out.println("这是defaultMethod...");
        }
    }
    ************************************************************************************************
    package com.imooc.default1.bean;
    
    public interface MyInterface2 extends MyInterface1 {
    
    }
    ***************************************************************************************************
    package com.imooc.default1.bean;
    
    public class MyInterface2Impl implements MyInterface2 {
    
        @Override
        public void test() {
            // TODO Auto-generated method stub
    
        }
    }
    *****************************************************************************************************
    package com.imooc.default1.bean;
    
    public class Test {
        public static void main(String[] args) {
            
            MyInterface2Impl myInterface2Impl=new MyInterface2Impl();
            
            myInterface2Impl.defaultMethod();//这是defaultMethod...
    
        }
    }
    
    

    2.函数式接口

    函数式接口:有且只有一个抽象方法,但是可以有多个非抽象方法的接口,函数式接口可以被隐式的转换为Lambda表达式
    
    函数式接口注解:
    在一个接口上加上@FunctionalInterface注解,这个接口就称为了一个函数式接口,如果不符合
    函数式接口的标准,加这个注解的时候会报错,加他是为了更加明显
    *********************************************************************************************************
    @FunctionalInterface
    public interface MyInterface1 {
    
        public abstract void test();
        
        default void defaultMethod() {
            
            System.out.println("这是defaultMethod...");
        }
    }
    
    

    3.Lambda表达式

    Lambda表达式可以看成是对匿名内部内的简写,使用Lambda表达式时,接口必选是函数式接口

    package com.imooc.java8.lambda;
    
    public interface MyInterface {
        void test();
    }
    *********************************************************************************************************
    package com.imooc.java8.lambda;
    
    import com.imooc.lamda.bean.MyInterface;
    
    public class Test {
    
        public static void main(String[] args) {
            
            /**
             * 使用匿名类,相等与new MyInterfaceImpl();
             * public class MyInterfaceImpl implements MyInterface {
             *      @Override
             *      public void test() {
             *
             *      }
             *  }
             * 接口是不能new的,此处new的是接口的实现
             */
            MyInterface myInterface=new MyInterface() {
                
                @Override
                public void test() {
                    System.out.println("这是接口当中方法的重写...");
                }
            };
            myInterface.test();//这是接口当中方法的重写...
        }
    }
    

    Lambda表达式演示

    package com.imooc.java8.lambda;
    
    public interface MyInterface {
        int add(int a,int b);
    }
    *****************************************************************************************************
    package com.imooc.java8.lambda;
    
    public class TestDemo {
    
        public static void main(String[] args) {
            
            System.out.println("************************匿名内部类的方式************************");
            //匿名内部类的方式
            MyInterface myInterface=new MyInterface() {
                
                @Override
                public int add(int a, int b) {
                    return a+b;
                }
            };
            
            System.out.println("************************使用Lambda表达式************************");
            //使用Lambda表达式
            MyInterface myInterface1=(int a,int b) -> a+b ;
            MyInterface myInterface2=(a,b)->a+b;
            MyInterface myInterface3=(a,b)->{
                System.out.println("Lambda方法体");
                return a+b;
            };
            
            System.out.println(myInterface.add(123, 456));
            System.out.println(myInterface1.add(123, 456));
            System.out.println(myInterface2.add(123, 456));
            System.out.println(myInterface3.add(123, 456));
        }
    }
    

    Lambda表达式作用域--final

    package com.imooc.java8.lambda;
    
    public class TestDemo1 {
    
        public static void main(String[] args) {
            
            System.out.println("***********************匿名内部类***********************");
    
            /**
             * 1.8之前,要在匿名内部内当中使用局部变量,局部变量必须要显示的指定final
             * 之后的默认是用final修饰的,可以不写final,但是他的值不能修改
             */
            int a=10;
            MyInterface2 myInterface2=new MyInterface2() {
                
                @Override
                public void test() {
                    
                    System.out.println(a);
                }
            };
            //a=11;报错,不能修改
            myInterface2.test();//10
            
            System.out.println("***********************Lambda***********************");
            int b=20;
            
            MyInterface2 myInterface22=() ->{System.out.println(b);};
            //b=11;Lambda也是一样不能修改
            myInterface22.test();//20
        }
    }
    
    

    Lambda表达式总结

    语法:
    (parameters) -> expression   或   (parameters) ->{ statements; }
    当为返回值,一般使用expression
    // 接收2个int型整数,返回他们的和
    (int x, int y) -> x + y
    (x,y) -> {return x+y}
     
    // 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
    (String s) -> System.out.print(s)
    

    Lambda表达式的构造方法引用

    package com.imooc.java8.lambda1;
    
    public class TestDemo {
    
        public static void main(String[] args) {
            
            PersonFactory factory=new PersonFactory() {
                
                @Override
                public Person createPerson(String firstName, String lastName) {
                    
                    return new Person(firstName, lastName);
                }
            };
            
            Person person=factory.createPerson("itsource", "java");
            System.out.println(person);
            
            System.out.println("************************使用Lambda表达式*************************");
            
            //使用Lambda表达式的常规写法
            PersonFactory factory2=(firstName,lastName) ->new Person(firstName, lastName);
            
            //使用Lambda表达式的简洁写法:构造方法引用
            PersonFactory factory3=Person::new;
            Person person2=factory2.createPerson("itsource", "java");
            Person person3=factory3.createPerson("itsource", "java");
    
            
        }
    }
    
    

    Lambda静态方法引用

    package com.imooc.java8.lambda2;
    
    public interface MyInterface {
    
        int parseInt(String str);
    }
    *******************************************************************************************************
    package com.imooc.java8.lambda2;
    
    public class Test {
        
        public static void main(String[] args) {
            
            MyInterface myInterface=new MyInterface() {
                
                @Override
                public int parseInt(String str) {
                    return Integer.parseInt(str);
                }
            };
            
            //Lambda常用方式
            MyInterface myInterface2=(str) ->Integer.parseInt(str);
            //Lambda静态方法方式
            MyInterface myInterface3=Integer::parseInt;
            
        }
    
    }
    
    

    Lambda实例方法引用

    package com.imooc.java8.lambda2;
    
    import java.util.function.Function;
    
    public class TestDemo {
    
        public static void main(String[] args) {
            
            Function<String, Boolean> function=new Function<String, Boolean>() {
    
                @Override
                public Boolean apply(String t) {
                    // TODO Auto-generated method stub
                    return t.endsWith("as");
                }   
            };
            String t="asfda";
            System.out.println(function.apply(t));
            
            Function<String, Boolean> function2=t::endsWith;
            function2.apply("asdfg");
            
        }
    }
    
    

    相关文章

      网友评论

          本文标题:2019-06-19 java8新特新Lambda表达式

          本文链接:https://www.haomeiwen.com/subject/bzukqctx.html