美文网首页
java中使用lambda语法

java中使用lambda语法

作者: John_Phil | 来源:发表于2019-01-09 08:10 被阅读0次

    Java 8引入Lambda表达式,在编写Lambda表达式时,也会随之被编译成一个函数式接口。在java中一般习惯使用Lambda语法来代替匿名内部类,代码简洁,易读。不过目前java对lambda语法的支持仍然有限,且执行效率低,所以项目中不建议使用lambda语法实现。

    1.实例化接口

    public interface InterfaceTest {
        public abstract void aaa();
    }
    
    //匿名内部类
     @Test
    public void method1(){
             new InterfaceTest(){
                 public void aaa(){
                     System.out.println("**a1**");
                 }
             }.aaa();
    }
    //lambda语法
     @Test
    public void method2(){
             InterfaceTest interfaceTest =(()->System.out.println("**b1**"));//匿名内部类
             interfaceTest.aaa();
    }
    
    抽象类不可以使用lambda语法
    public abstract class AbstractTest {
        public abstract void bbb();
    }
    
    
    //       不能实例化抽象类 以下代码会报错
    //       AbstractTest abstractTest=(()->System.out.println("***b2***"));
    //       abstractTest.bbb();
    

    2.实例化实现接口的普通类

    public class CommonClass implements InterfaceTest {
    
        public CommonClass() {
        }
            //想要用lambda通过new普通类实现接口方法的实现需要写此含接口的构造器
        public CommonClass(InterfaceTest interfaceTest) {
        }
    
        public void ccc(){
        System.out.println("cccccc");   
        }
    
        @Override
        public void aaa() {
            // TODO Auto-generated method stub
            System.out.println("普通类从接口继承");
        }
    
    }
    
    //普通方法
     @Test
    public void method3(){
            new  CommonClass(new CommonClass(){
                public void aaa(){
                    System.out.println("***b3****");
                }
            });
    }
    //lambda语法
     @Test
    public void method4(){
            //实例化 实现接口的普通类
        new  CommonClass(()->System.out.println("***b3****"));
    }
    

    3.lambda具体语法

    3.1 定义多个参数有返回值

    如果“语句或语句块”有返回值时,如果只有一条语句则可以不输写“return”语句,编译器会自动处理,否则必须加上,如下示

    //定义接口
    public interface InterfaceTest2 {
        public int aaa(int x,int y);
    }
    
     @Test
    public void method5(){
      // 括号内可以有多个参数 ,如果只有返回值可以不写return
      InterfaceTest2 interfaceTest21=((x,y) ->  x+y ); 
      //如果除了返回值 还要写其他表达式   需要加大括号 和return语句
      InterfaceTest2 interfaceTest22=((x,y) -> {System.out.println(x+y);return x+y;}); 
      System.out.println("*******"+interfaceTest2.aaa(5, 6));
    }
    

    3.2 可以改变 当前类以内的成员变量而 局部变量 不能修改!

    public interface InterfaceTest2 {
        public int aaa(int x,int y); 
    }
    public interface InterfaceTest3 {
        public void aa(int x,int y);
    }
    
    
    int aa=10;
    public void method6(){
        int a=10;//需要加final修饰
        InterfaceTest2 interfaceTest22=((x,y) -> {a=x+y;return x+y;});//报错Local variable a defined in an enclosing scope must be final or effectively final
        InterfaceTest3 interfaceTest3=((x,y) -> aa=x+y  );
        interfaceTest3.aa(15, 16);
        System.out.println(aa); //结果为 31 说明成员变量可以在lambda表达式中被修改
        
    }
    

    3.3在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量(可以与成员变量重名)

      int y=10;
      @Test
      public void method7(){
        int x=10;
        InterfaceTest3 interfaceTest3=((x,y) -> aa=x+y  ); // x报错
      }
    

    3.4 使用lambda遍历集合

     @Test 
    public void method8() { 
    List<String> languages = Arrays.asList("aaa","bbb","ccc"); 
    //使用foreach语句遍历集合
    for(String each:languages) {
     System.out.println(each); 
    } 
    //使用lambda语法遍历
    languages.forEach(x -> System.out.println(x));
     languages.forEach(System.out::println);
     }
    

    相关文章

      网友评论

          本文标题:java中使用lambda语法

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