博客 爪哇 OCAJP 8–Lambda表达式示例

OCAJP 8–Lambda表达式示例

在这篇文章中,我们将解释Java 8中的一项重要功能。 。 OCAJP 8Java认证考试中也包含此功能。您应该对概念和练习有足够的了解,以回答真实考试中的所有问题。我们的 OCAJP 8exam simulator 使用lambda表达式涵盖更多问题。

什么是Lambda表达式?

  • Lamdba Expressions是JDK 8中引入的新功能。
  • 由于两个主要原因,lambda表达式(及其相关功能)显着增强了Java。
  • 首先,它们添加了新的语法元素,从而增强了语言的表达能力。
  • 其次,增加了lambda表达式,导致将新功能合并到API库中。
  • 除了lambda表达式为语言带来的好处外,还有另一个优点

它们构成Java的重要补充的原因。在过去的几年中,lambda表达式已成为计算机语言设计的主要重点。例如,它们已被添加到C#和C ++之类的语言中。

  • 在学习Lamdba表达式之前,您需要知道什么是功能接口。

什么是功能接口?

  • 功能接口是仅包含一个抽象方法并且可以包含任意数量的默认方法和静态方法的接口(自Java 8开始,在接口中允许使用默认方法和静态方法)。

例:

接口MyNumber {
getValue();
}

  • MyNumber在这里是一个Functional接口,因为它包含一个抽象方法。
  • 让我们看另一个例子

例:

整型erface MyValue {
getValue( );
printValue( );
}
  • MyValue不是功能性接口,因为它包含两个抽象方法。

例:

整型erface Sample {
print( );
static void sayHello() {
System.out.println("Hello World " );
} }
  • Sample是一个功能接口,因为它仅包含一个抽象方法。

Lambda表达式

  • A lambda表达式 是匿名(即未命名)方法。
  • 它用于实现功能接口定义的方法。
  • A lambda表达式被分配给 功能接口参考。
  • Lambda表达式 不是单独执行的。
  • 当您使用 接口参考 Lambda表达式 将被执行。
  • 因此,lambda表达式导致匿名类的形式。
  • Lambda表达式通常也称为 关闭.
  • lambda表达式在Java语言中引入了新的语法元素和运算符。
  • 新的运算符有时称为 Lambda运算子 或者 箭头运算符 那是 −>.
  • 它将lambda表达式分为两部分。左侧指定所需的任何参数

通过lambda表达式。 (如果不需要任何参数,则使用一个空的参数列表。)在右侧是 λ体, 指定lambda表达式的操作。

  • 爪哇定义了两种类型的lambda主体。一个由单个表达式组成,另一种由一个代码块组成。
  • 让我们来编写第一个lambda示例。
    	
    interface MyNumber {
    	int getValue();
    }
    public class SupplyDemo {
    public 静态的 void main(String[] args) {
    MyNumber num1 = () -> 9;
    MyNumber num2 = () -> { return 5; };
    System.out.println(num1.getValue()); //prints 9
    System.out.println(num2.getValue()); //prints 5
    
    }
    }
    
  • 在编写lambda表达式时,请首先查看功能接口方法声明。
  • getValue不需要任何参数。因此,括号是强制性的。
  • 如果功能接口方法不带任何参数,则lambda表达式的参数列表中必须带括号。
  • 查看功能接口方法的返回类型。它返回int。因此,我们的lambda表达式应返回int值。
  • 如果lambda表达式仅包含一个语句,则花括号是可选的。如果lambda表达式仅包含一个以上的语句,则必须使用大括号。
  • 当lambda表达式仅包含一个语句时,默认情况下,lambda表达式将返回该语句。
  • 即使Lambda表达式包含多个语句,也应以分号结尾。
  • 使用Lambda表达式,您可以向函数接口方法编写多个实现,但应与方法声明兼容。
  • 当您调用num1.getValue()时,将执行Lambda表达式并返回值9。
  • 当您调用num2.getValue()时,将执行Lambda表达式并返回值5。
  • 让我们了解另一个例子
    	
    interface 数值测试 {
    boolean test(int n);
    }
    class LambdaDemo2 {
    
    public 静态的 void main(String args[])
    {
    
    // A lambda表达式 that tests if a number is even.
    NumericTest isEven = (n)-> (n % 2)==0;
    
    if(isEven.test(10)) System.out.println("10点是偶数");
    
    if(!isEven.test(9)) System.out.println("9甚至没有");
    
    // Now use a lambda表达式 that tests if a number
    // is non-negative.
    NumericTest isNonNeg = (n)-> n >= 0;
    
    if(isNonNeg.test(1)) System.out.println("1为非负");
    if(!isNonNeg.test(-1)) System.out.println("-1为负");
    }
    }
    
  • 该程序的输出如下所示:

10点是偶数

9甚至没有

1为非负

-1为负

  • 要特别注意执行均匀性测试的lambda表达式。再次显示在这里:

(n)-> (n % 2)==0

  • 请注意, n 未指定。相反,其类型是根据上下文推断的。
  • 在这种情况下,其类型是根据参数类型推断的 测试() 数值测试 接口,这是 整型.
  • 也可以在lambda表达式中显式指定参数的类型。例如,这也是编写上述内容的有效方法:

(int n)-> (n % 2)==0

  • 这里 n 被明确指定为 整型。通常不需要显式指定类型,但是在需要这种情况的情况下可以。
  • 当lambda表达式仅具有一个参数时,在lambda运算符的左侧指定参数名称时,不必在括号中加上参数名称。
  • 例如,这也是编写程序中使用的lambda表达式的有效方法:

n-> (n % 2)==0

  • 下一个程序演示了一个带两个参数的lambda表达式。在这种情况下,lambda表达式测试一个数字是否是另一个数字的因数。

//演示带有两个参数的lambda表达式。

整型erface 数值测试2 {
布尔测试(int n,int d);
}

class LambdaDemo3 {
public 静态的 void main(String args[])
{

// This lambda表达式 determines if one number is
// a factor of another.
NumericTest2 isFactor = (n,d)-> (n % d) == 0;
if(isFactor.test(10, 2))
System.out.println("2是10的因数");
if(!isFactor.test(10, 3))
System.out.println("3不是10的因数");
}
}

输出显示在这里:

2是10的因数

3不是10的因数

  • 在此程序中,功能界面 数值测试2 定义 测试() 方法:

布尔测试(int n,int d);

  • 在这个版本中 测试() 指定两个参数。因此,为了使lambda表达式与 测试(),lambda表达式还必须指定两个参数。注意

如何指定它们:

(n,d)-> (n % d) == 0

  • 只要需要多个参数,就在lambda运算符左侧的带括号的列表中指定参数,并用逗号分隔。
  • 这是关于lambda表达式中的多个参数的重要说明:如果需要显式声明参数的类型,则所有参数都必须具有声明的类型。例如,这是合法的:

(int n,int d)-> (n % d) == 0

  • 但这不是:

(int n,d)-> (n % d) == 0

谓词

  • 谓词是预定义的功能接口,可在java.util.function包中使用。这是一个通用类型。

  • OCAJP 8考试目标中列出了谓词。

  • Lambda表达式本身无法指定类型参数。因此,lambda表达式不能是通用的。 (当然,由于类型推断,所有的lambda表达式都表现出一些“generic-like” qualities.)
  • 但是,与lambda表达式关联的功能接口可以是通用的。在这种情况下,lambda表达式的目标类型部分由声明函数接口引用时指定的一个或多个类型实参确定。

公共接口谓词{
布尔检验(T t);

}

  • 谓词方法采用任何类的实例并返回布尔值。
  • 让我们看一下使用谓词的示例示例
public class 谓词Demo {
public 静态的 void main(String[] args) {
Predicate start = s -> s.startsWith("O");
System.out.println(start.test("OCAJP8")); // prints true
}
}

将Lambda表达式作为参数传递

  • 实际上,将lambda表达式作为参数传递是lambda的常见用法。此外,它是一种非常强大的用法,因为它为您提供了一种将可执行​​代码作为方法的参数传递的方法。
  • 这极大地增强了Java的表达能力。
  • 要将lambda表达式作为参数传递,接收lambda表达式参数的参数的类型必须是与lambda表达式兼容的功能接口类型。

例:

public class 谓词Demo {
public 静态的 void main(String[] args) {
call(s -> s.startsWith("O"),"OCAJP8");
}
public 静态的 void call(Predicate <String> start, String l) {
boolean b = start.test(l)?true : false ;
System.out.println(b); // prints true
}
}

和例外

  • Lambda表达式可以引发异常。但是,如果引发了检查的异常,则该异常必须与列表中列出的异常兼容。 抛出 功能接口中抽象方法的子句。这是说明此事实的示例。
class NotValidString extends Exception{}
interface Sample{
void print(T t) 抛出 NotValidString;
}
public class Test {

public 静态的 void main(String[] args) 抛出 NotValidString {

Sample l = s->{

if(s.length()==0)
throw new NotValidString();
else
System.out.println(s);

};


l.print("OCA");
l.print(" ");

}

}

第一次调用l.print(“OCA”) 打印值OCA。第二个调用传递长度为零的字符串,导致NotValidString异常 被抛出。请记住,在打印中包含throws子句是​​必要的。没有它,该程序将无法编译,因为lambda表达式将不再与print()兼容。

Lambda表达式和变量捕获

  • 由lambda表达式的包围范围定义的变量可在lambda表达式内访问。例如,lambda表达式可以使用实例或 静态的 由其封闭类定义的变量。
  • 因此,lambda表达式可以获取或设置实例或 静态的 变量并调用由其封闭类定义的方法。
  • 但是,当lambda表达式使用其包围范围中的局部变量时,会创建一种特殊情况,称为 变量捕获.
  • 在这种情况下,lambda表达式只能使用 有效地最终.
  • 有效的最终变量是在首次赋值后其值不变的变量。
  • 无需显式声明这样的变量: 最后,尽管这样做不会出错。
整型erface Sample {
int sum(int t);
}

public class 谓词Demo {

public 静态的 void main(String[] args) {
int b = 5;
Sample l = a -> {

int c = a + b;

// the following commented statement causes error if uncommented
// b++;
return c;

};
// the following commented statement causes error if uncommented
// b=6;

System.out.println(l.sum(10));//prints 15
}

}
  • 如评论所示,b 是有效的最终值,因此可以在Lambda表达式中使用。
  • 但是,如果b 在lambda内部或外部进行修改,b 将会失去其有效的最终地位。这将导致错误,并且程序将无法编译。

我们希望本文对理解OCAJP 8考试中使用的Lambda表达式有所帮助。请尝试我们的 OCAJP 8的免费模拟考试.

如果您在准备OCAJP考试时需要任何帮助或支持,请给我们发送邮件或致电我们的支持号码!!

关于阿米特·维尔玛(Amit Verma)

阿米特(Amit)是一位热情的技术作家。他总是以他的创新思维和实践方法来激励技术人员。毫无疑问,主要的问题解决者是每个技术问题的追求者!
传播爱心

发表评论

请输入您的评论!
请在这里输入您的名字