zoukankan      html  css  js  c++  java
  • Lambda 表达式 in java 8

    Lambda 表达式 in Java 8

    • Lambda表达式是java 8 新增的特性
    • Lambda表达式主要作用:支持将代码块作为方法参数,允许使用更简洁的代码创建函数式接口的实例,是匿名内部类的一种简化,可以部分取代匿名内部类的作用。
    • 函数式接口:只有一个抽象方法的接口。
    • Lambda表达式又称为匿名函数(anonymous function),表示一类无需定义标识符(函数名)的函数或者子程序,可以看做是一种语法糖

    Lambda 表达式语法格式

    Lambda表达式在java中由三部分组成:

    • 形参列表:形参列表允许省略形参类型,如果形参列表只有一个参数,形参列表外的圆括号也可以省略
    • 箭头->:箭头不可省略
    • 代码块:如果代码块只有一条语句,允许省略代码块的花括号;更有甚者,只有一条return语句,可以省略return关键字。
    interface Eatable{
    	void taste();
    }
    
    interface Flyable{
    	void fly(String weathrer);
    }
    
    interface Addable{
    	int add(int a,int b);
    }
    
    public class LambdaTest {
    	public void eat(Eatable e) {
    		e.taste();
    		System.out.println(e);
    	}
    	public void fly(Flyable f) {
    		f.fly("好天气");
    		System.out.println(f);
    	}
    	public void add(Addable a) {
    		System.out.println(a.add(5, 3));
    	}
    	
    	public static void main(String[] args) {
    		LambdaTest test = new LambdaTest();
    		test.eat(()->System.out.println("苹果"));
    		test.fly(weater->{
    			System.out.println("哈哈哈");
    			System.out.println("可以飞行");
    		});
    		// 省略形参类型 省略花括号
    		test.add((a,b)->a+b);
    	}
    }
    

    函数式接口

    • 函数式接口是指只包含一个抽象方法的接口,(可有其他默认方法(default修饰)或者类方法)java 8 中有大量的函数式接口如最常见的:Runnable,ActionListener,并提供了@FunctionInterface注解,告诉编译器执行更严格的检查。
    Runnbale r =()->{
    	for(int i =0;i<100;i++){
    		System.out.println(i);
    	}
    }; // 注意分号
    
    
    • Lamdba 表达式的目标类型只能是函数式接口。
    • Lambda 表达式常应用场景:
      1. 将Lambda表达式赋值给函数式接口类型的变量
      2. 作为函数接口类型的参数传给某个方法
      3. 使用函数式接口对Lambda表达式进行强制类型转换
    Object obj = (Runnable)()->{
    	System.out.println(...);
    };
    

    方法引用和构造器引用

    • 应用场景:代码块只有一条语句,并且该语句为调用方法或者构造器
    • 应用目的:使Lambda表达式的语法更为简洁
    • 应用方式:::
    @FunctionalInterface
    interface Converter{
    	Integer convert(String from);
    }
    
    // 类方法
    Converter con = from->Integer.valueOf(from);
    Converter con1 = Integer::valueOf;
    
    // 对象方法
    Converter con2 = from->"hhhh".indexOf(from);
    Converter con3 = "hhhh"::indexOf;
    
    // 构造器类似
    // ::new
    

    Lambda表达式与匿名内部类的联系和区别

    • Lambda表达式简化了部分匿名内部类的写法(函数式接口),表现性质和匿名内部类一致,可以访问effective final局部变量,和外部类成员变量
    • 匿名内部类的应用范围更广,它可以为任何接口创建实例,也可以服务于抽象类和普通类
    • 注意Lambda表达式的代码块不允许调用接口中定义的默认方法
  • 相关阅读:
    childNodes.length和form.length的不同
    外部样式表声明的样式并不会进入style对象
    js之insertBefore(newElement,oldElement)
    文字不换行,超出部分显示成省略号
    animation和transition做动画的区别
    html中隐藏一个元素的方法
    css常见属性和属性值
    css选择器的优先级
    frameset怎么框架内部跳转
    form表单标签及属性的介绍
  • 原文地址:https://www.cnblogs.com/zoe-mine/p/8023850.html
Copyright © 2011-2022 走看看