4年前 (2021-05-13)  Java系列 |   抢沙发  380 
文章评分 0 次,平均分 0.0

Java Lambda表达式示例
Lambda表达式是java8中引入的一个新特性。lambda表达式是匿名函数。一个没有名字也不属于任何类的函数。lambda表达式的概念最早是在LISP语言中引入的。

Java Lambda表达式语法

为了创建lambda表达式,我们在lambda操作符->的左侧指定输入参数(如果有),并将表达式或语句块放置在lambda操作符的右侧。例如,lambda表达式(x,y)->x+y指定lambda表达式接受两个参数xy并返回它们的和。

//Syntax of lambda expression
(parameter_list) -> {function_body}

Java中Lambda表达式与方法

Java中的方法(或函数)有以下主要部分:

  • 名称
  • 参数列表
  • 方法体
  • 返回类型

Java中的lambda表达式包含以下主要部分:

Lambda表达式只有主体和参数列表。

  • 没有名字-函数是匿名的,所以我们不关心名字
  • 参数列表
  • 主体-这是功能的主要部分。
  • 无返回类型–Java8编译器能够通过检查代码来推断返回类型。你不必明确提及。

在哪里使用Java中lambda

要使用lambda表达式,您需要创建自己的函数接口或使用Java提供的预定义函数接口。只有单个抽象方法的接口称为函数接口(或单个抽象方法接口),例如:RunnableCallableActionListener等。

要使用函数接口:

  • Java8之前的版本:我们创建匿名内部类。
  • 后Java8:可以使用lambda表达式而不是匿名内部类。

Java Lambda表达式示例

不使用Lambda表达式:在java8之前,我们使用匿名内部类来实现函数接口的唯一抽象方法。

import java.awt.*;  
import java.awt.event.*;  
public class ButtonListenerOldWay {  
    public static void main(String[] args) {  
       Frame frame=new Frame("ActionListener Before Java8");  
    
       Button b=new Button("Click Here");  
       b.setBounds(50,100,80,50);  
  
       b.addActionListener(new ActionListener(){  
          public void actionPerformed(ActionEvent e){  
    	     System.out.println("Hello World!"); 
          }  
       });  
       frame.add(b);
    
       frame.setSize(200,200);  
       frame.setLayout(null);  
       frame.setVisible(true);   
    }  
}

通过使用Lambda表达式:而不是创建匿名内部类,我们可以创建如下Lambda表达式:

import java.awt.*;  
public class ButtonListenerNewWay {  
   public static void main(String[] args) {  
      Frame frame=new Frame("ActionListener java8");  
     
      Button b=new Button("Click Here");  
      b.setBounds(50,100,80,50); 
  
      b.addActionListener(e -> System.out.println("Hello World!")); 
      frame.add(b);
  
      frame.setSize(200,200);  
      frame.setLayout(null);  
      frame.setVisible(true);   
   }  
}

注意:

  • 如您所见,我们对lambda表达式使用的代码较少。
  • 向后兼容性:可以在旧代码中使用lambda表达式。lambda是向后兼容的,所以当您将项目迁移到java8时,可以在现有API中使用它们。

让我们再看几个Lambda表达式的例子。

示例1:无参数的Java Lambda表达式

@FunctionalInterface
interface MyFunctionalInterface {

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

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

输出:

Hello

示例2:单参数Java Lambda表达式

@FunctionalInterface
interface MyFunctionalInterface {

	//A method with single parameter
    public int incrementByFive(int a);
}
public class Example {

   public static void main(String args[]) {
        // lambda expression with single parameter num
    	MyFunctionalInterface f = (num) -> num+5;
        System.out.println(f.incrementByFive(22));
    }
}

输出:

27

示例3:多参数Java Lambda表达式

interface StringConcat {

    public String sconcat(String a, String b);
}
public class Example {

   public static void main(String args[]) {
        // lambda expression with multiple arguments
    	StringConcat s = (str1, str2) -> str1 + str2;
        System.out.println("Result: "+s.sconcat("Hello ", "World"));
    }
}

输出:

Result: Hello World

示例4:使用foreach循环迭代集合

import java.util.*;  
public class Example{  
    public static void main(String[] args) {       
       List<String> list=new ArrayList<String>();  
       list.add("Rick");         
       list.add("Negan");       
       list.add("Daryl");         
       list.add("Glenn");         
       list.add("Carl");                
       list.forEach(          
           // lambda expression        
           (names)->System.out.println(names)         
       );     
    }  
}

用Lambda表达式迭代java8中的Map

import java.util.HashMap;
import java.util.Map;
public class IterateMapUsingLambda {
	public static void main(String[] args) {
		Map<String, Integer> prices = new HashMap<>();
		prices.put("Apple", 50);
		prices.put("Orange", 20);
		prices.put("Banana", 10);
		prices.put("Grapes", 40);
		prices.put("Papaya", 50);
		
		/* Iterate without using Lambda
		   for (Map.Entry<String, Integer> entry : prices.entrySet()) {
		   System.out.println("Fruit: " + entry.getKey() + ", Price: " + entry.getValue());
		   }
		*/ 
		
		prices.forEach((k,v)->System.out.println("Fruit: " + k + ", Price: " + v));

	}
}

输出:

Fruit: Apple, Price: 50
Fruit: Grapes, Price: 40
Fruit: Papaya, Price: 50
Fruit: Orange, Price: 20
Fruit: Banana, Price: 10

用Lambda表达式迭代java8中的List

import java.util.List;
import java.util.ArrayList;
public class IterateListUsingLambda {
	public static void main(String[] argv) {
		List names = new ArrayList<>();
		names.add("Ajay");
		names.add("Ben");
		names.add("Cathy");
		names.add("Dinesh");
		names.add("Tom");
		
		/* Iterate without using Lambda
		 Iterator iterator = names.iterator();
		 while (iterator.hasNext()) {
			System.out.println(iterator.next());
		 } 
		*/ 
		names.forEach(name->System.out.println(name));
	}
}

输出:

Ajay
Ben
Cathy
Dinesh
Tom
 

除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/1912.html

关于

发表评论

表情 格式

暂无评论

登录

忘记密码 ?

切换登录

注册