Lambda Expression lambda表达式

package java_5_31
/*
 * @Description: 
 * @Author: Rainbow
 * @version:v1.0
 * @date:2021年5月31日下午3:37:23
 *
 * * ## 从Java JDK8版本开始,Java新增了lambda 表达式。它会产生一个匿名类,也称为闭包。
 * ## lambda 表达式的Java实现有两个结构:一个是lambda 表达式自身,二是函数式接口。
 * 表达式本质上就是一个匿名方法,这个方法不独立执行,它是用于实现由函数式接口定义的另一个方法。
 * 函数式接口是有且仅有一个抽象方法的接口。接口通常表示单个动作。
 * 函数式接口有时称为SAM 类型,单抽象方法(Single Abstract Method)
 * 
 * ##举例:如,标准接口Runnable 是一个函数式接口,因为它只定义了一个方法run();因此,run定义
 *             了Runnable 的动作。
 * ## lambda 表达式  1.运算符:-> 
 *                  2.基本组成:表达式分两部分。左侧指定了lambda表达式所需的所有参数。
 *                              右侧是lambda 体,指定了lambda表达式的动作。
 * ## Java定义了两种lambda表达式体。一种:包含单个表达式 另一种:包含一个代码块。
 *     1.单表达式  () -> 23.3    ()-> Math.random() * 100  (n) ->(n%2)==0 返回值是布尔类型。  
 *        当lambda表达式仅有一个参数时,可以不加圆括号。
 *     2.块表达式:它允许在花括号内创建lambda体包含多条语句。如:在块中,声明变量,
 *     使用循环,指定if、switch语句、  创建嵌套代码块等
 *       
 *
 * ##用注解 @FunctionalInterface  的格式,确定该接口只有一个抽象方法,是函数式接口。
 */

//函数式接口例子
//无参数,只有返回值。
interface MyValue {
	double getValue();
}

//带参数的lambda表达式,函数式接口中抽象方法的形参数量与lambda的参数数量相同。
interface MyparamValue {
	double getValue(double v);
}

//块lambda
interface NumericFunc { // numeric 数值的,数字化。
	int func(int n);
}

//泛型函数接口
interface SomeTest<T>{
	boolean test(T n,T m);
}

public class lambdaDemo {
	public static void main(String[] args) {
		MyValue myval;
		myval= ()-> 90.0;
		//MyValue myval=() -> 90.0 ; 也可以这样写。
		
		System.out.println("A constant value:"+myval.getValue());
		System.out.println();
	   //因为赋给myval 的lambda表达式的返回值是90.0;所以调用getValue()方法时返回值也是90.0;
	
		MyparamValue mypval= (n) -> 1.0/n;//带参数的表达式
		System.out.println("parametric of 4 is: "+mypval.getValue(4.0));
		System.out.println("parametric of 16 is: "+mypval.getValue(16.0));
		System.out.println();
		
		//块lambda
		NumericFunc smallestF=(n) ->{
			int result=1;
			n=n<0? -n:n;  //n 的取值为正。
			for(int i=2;i<=n/i;i++)
				if(n%i==0) {
					result =i;
					break;
				}
			return result;
			
		};
		System.out.println("smallest factor of 12 is "+smallestF.func(12));
		System.out.println("smallest factor of 11 is "+smallestF.func(11));
		System.out.println();
		
		//泛型函数式接口。  
		//lambda表达式自身不能指定类型形参。由于lambda表达式存在类型推断,
		//展现出了一些类似泛型的特征。但lambda表达式关联的函数式接口可以是泛型的。
		SomeTest<Integer> isFactor =(n,d) -> (n % d)==0;
		
		if(isFactor.test(10, 2))
			System.out.println("2 is a factor of 10 ");
			System.out.println();
			
		SomeTest<Double> isFactorA=(x,y) -> (x%y)==0;
		
		if(isFactorA.test(102.2,40.2))
			System.out.println("40.2 is a factor of 102.2 ");
		else
			System.out.println("40.2 is not a factor of 102.2");
			System.out.println();
		
		SomeTest<String> isIn=(a,b)-> a.indexOf(b) !=-1;
		//public int indexOf(String str) 查找子串,返回第一个找到索引的位置,没有找到返回-1
		String str="Generic Functional Interface!";
		System.out.println("Testing string: "+str);
		
		if(isIn.test(str, "Interface")) {
			System.out.println("Interface is found!");
		}else {
			System.out.println("Interface is not found! ");
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值