简单的Lambda表达式(适用JAVA初学者)

2021-08-23 17:50:13 浏览数 (1)

简单的Lambda表达式--适用JAVA初学者

    • Lambda表达的组成部分
      • 一些示例实现和输出
      • 功能接口中的Lambda表达式
      • 哈希映射中的Lambda表达式
      • 用于运行线程的Lambda表达式
      • Lambda表达式以比较和过滤集合列表
    • 使用Lambda表达式时要注意的几点
    • 为什么使用Lambda表达式
    • 相关内容

Lambda表达式是一小段代码,它接受参数并返回一个值。下面的示例表达式具有一个参数。该表达式还可以包含两个或多个参数。

代码语言:javascript复制
parameter -> expression

Lambda表达式也可以视为匿名函数。没有名称且不属于任何类的函数。Lambda表达式类似于方法,但是它们不需要名称,可以在方法主体中实现。

代码语言:javascript复制
(parameter1, parameter2) -> expression

Lambda表达式的概念最早是在LISP编程语言中引入的。表达式是有限的。它们必须立即返回一个值,并且不能包含诸如if或的变量,赋值或语句for。为了执行更复杂的操作,可以将代码块与花括号一起使用。

代码语言:javascript复制
(parameter_list) -> {function_body}

如果lambda表达式需要返回一个值,则代码块应具有return语句。

Lambda表达的组成部分

Lambda表达式通常包含以下三个组成部分:

  • Argument-list:此参数通常是一个列表。它也可以是空的或非空的。
  • 箭头标记:用于链接参数列表和表达式主体。
  • 正文:它包含用于lambda表达式的表达式和语句。主体可以是简单的语句,也可以包含代码块。

一些示例实现和输出

对于第一个示例,我们将从数字列表开始。我们将对该列表的内容进行一些数学计算。

代码语言:javascript复制
// A Java program to demonstrate simple lambda expressions 
import java.util.ArrayList;

public class Main {
  public static void main(String[] args) {
    // Creating an ArrayList with elements  
    // And add elements{7,4,2} to the list
    ArrayList<Integer> numbers = new ArrayList<Integer>();
    numbers.add(7);
    numbers.add(4);
    numbers.add(2);

    //Using Lambda to print out all elements
    numbers.forEach( n -> System.out.println(n));

    //Using Lambda to print out the double value of each element
    numbers.forEach( n -> System.out.println(n n));

    //Using Lambda to print all even elements
    numbers.forEach( n -> {if (n%2 == 0) System.out.println(n);});
  }
}

在上面的Java类中,我们有三个不同的Lambda表达式。

  • 第一个表达式遍历列表,并在新行上打印出每个值。
  • 第二个打印出每个元素加上自身的值。
  • 第三个仅打印偶数。

输出1

代码语言:javascript复制
7
4
2

输出2

代码语言:javascript复制
14
8
4

输出3

代码语言:javascript复制
4
2

功能接口中的Lambda表达式

对于这些下一个示例,我们将使用功能接口。 功能接口在Java是只包含一个抽象的(未实现)方法的接口。功能接口还可以包含具有实现的默认方法和静态方法。

  • 无参数的功能接口
代码语言:javascript复制
interface MyFunctionalInterface {

    //A method with no parameter
    public String sayHello();
}
public class ExampleOne {

   public static void main(String args[]) {
        // lambda expression
        MyFunctionalInterface message = () -> {
            return "Hello";
        };
        System.out.println(message.sayHello());
    }
}

输出量

代码语言:javascript复制
Hello
  • 具有一个参数的功能接口
代码语言:javascript复制
interface MyFunctionalInterface {

    //A method with one parameter
    public String sayHelloName(String str);
}
public class ExampleTwo {

   public static void main(String args[]) {
        // lambda expression
        MyFunctionalInterface message = (str) -> {
            return "Hello "   str;
        };
        System.out.println(message.sayHelloName("Joy"));
    }
}

输出量

代码语言:javascript复制
Hello Joy
  • 具有多个参数的功能接口
代码语言:javascript复制
interface MyFunctionalInterface {

    //A method with one parameter
    public String concatStrings(String str1, String str2);
}
public class ExampleThree {

   public static void main(String args[]) {
        // lambda expression
        MyFunctionalInterface message = (str1, str2) -> {
            return str1   str2;
        };
        System.out.println(message.concatStrings("Good ","Day"));
    }
}

输出量

代码语言:javascript复制
Good Day

哈希映射中的Lambda表达式

Lambda表达式也可以在哈希映射中使用,以对Map的元素进行迭代或进行计算更改。让我们在下面看这个例子。

代码语言:javascript复制
public class HashMapExample{
  public static void main(String[] args) {
    // Creating a HashMap and putting in elements
    Map<String, Integer> prices = new HashMap<>();
    prices.put("Apple", 50);
    prices.put("Orange", 20);
    prices.put("Banana", 10);
    prices.put("Grapes", 40);

    //Using Lambda to print out all elements, k=key,v=value
    prices.forEach((k,v)->System.out.println("Fruit: "   k   ", 
    Price: "   v));
  }
}

输出量

代码语言:javascript复制
Fruit: Apple, Price: 50
Fruit: Orange, Price: 20
Fruit: Banana, Price: 10
Fruit: Grapes, Price: 40

用于运行线程的Lambda表达式

您可以使用lambda表达式来运行线程。在以下示例中,我们通过使用lambda表达式实现run方法。

代码语言:javascript复制
public class ThreadExample{
  public static void main(String[] args) {
        //Thread Example without lambda  
        Runnable r1=new Runnable(){  
            public void run(){  
                System.out.println("Thread1 is running...");  
            }  
        };  
        Thread t1=new Thread(r1);  
        t1.start();  
        //Thread Example with lambda  
        Runnable r2=()->{  
                System.out.println("Thread2 is running...");  
        };  
        Thread t2=new Thread(r2);  
        t2.start();  
  }
}

输出量

代码语言:javascript复制
Thread1 is running...
Thread2 is running...

Lambda表达式以比较和过滤集合列表

Lambda表达式也可以用作比较器,也可以用于过滤列表。

代码语言:javascript复制
class Product{  
    int id;  
    String name;  
    float price;  
    public Product(int id, String name, float price) {  
        super();  
        this.id = id;  
        this.name = name;  
        this.price = price;  
    }  
}  

public class FilterListExample{
  public static void main(String[] args) {
        List<Product> list=new ArrayList<Product>();  
        list.add(new Product(1,"Volvo",19000f));  
        list.add(new Product(3,"Tesla",75000f));  
        list.add(new Product(2,"Toyota",38000f)); 

        // using lambda to filter data  
        Stream<Product> filtered_data = list.stream().filter(p -> 
        p.price > 3000);  

        // using lambda to iterate through collection  
        filtered_data.forEach(  
                product -> System.out.println(product.name ": 
        " product.price)   
       );
  }
}

输出量

代码语言:javascript复制
Tesla: 75000.0
Toyota: 38000.0

使用Lambda表达式时要注意的几点

  • Lambda表达式的主体可以包含零个,一个或多个语句。
  • 如果只有一条语句,则不必使用大括号,并且匿名函数的返回类型与主体表达式的返回类型相同。
  • 如果有多个语句,则必须将它们括在大括号(一个代码块)中,并且匿名函数的返回类型与该代码块内返回的值的类型相同;如果不返回任何值,则返回void

为什么使用Lambda表达式

这是使用Lambda表达式的一些好处。

1.更少的代码行: 使用lambda表达式的好处之一是减少了代码量。

2.通过在方法中传递行为来支持顺序和并行执行: 随着Java 8中Stream API的引入,可以将函数传递给收集方法,现在由收集负责以顺序或并行方式处理元素。

3.更高的效率(利用多核CPU): 如果对集合进行批量操作,则使用Stream API和lambda表达式可以实现更高的效率(并行执行)。同样,lambda表达式可以帮助实现集合的内部迭代,而不是如上例所示的外部迭代。如今,我们拥有带多核的CPU,因此可以通过使用lambda并行处理集合来利用这些多核CPU。

总之,欢迎使用Lambda表达式添加到任何代码库中,本文旨在展示如何使用和应用它们的指针。

0 人点赞