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! ");
}
}
}
Lambda Expression lambda表达式
最新推荐文章于 2024-04-27 08:01:19 发布