Lambda表达式可以简单的理解为可传递的匿名函数的一中方式,它没有名称,但它有参数列表、函数主体、返回类型。可以让我们编程更加的方便。
在Java8引入了一个新的基础语法:就是一个“->”。该操作符称为箭头操作符或者Lambda操作符。
箭头将Lambda表达式拆分为两个部分

  1. 左侧:Lambda表达式的参数列表
  2. 右侧:Lambda表达式中所需执行的功能,即Lambda体

Lambda的语法格式

语法格式一:无参数,无返回值
() -> System.out.println("Hello Lambda!");
语法格式二:有一个参数,并且无返回值
(x) -> System.out.println(x)
语法格式三:若只有一个参数,小括号可以省略不写
x -> System.out.println(x)
语法格式四:有两个以上的参数,有返回值,并且 Lambda 体中有多条语句
	Comparator<Integer> com = (x, y) -> {
 		System.out.println("函数式接口");
 		return Integer.compare(x, y);
 	};
语法格式五:若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写
Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
语法格式六:Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断”
//即以下代码中的“Integer”可以省略
(Integer x, Integer y) -> Integer.compare(x, y);

接下来我将以代码演示,在Java8之前没lambda表达式的样子,以及有lambda表达式后的变化。

在Java8之前没有Lambda表达式

public void test1(){
		//最原始:首先自定义一个排序类,再作为参数传递给TreeSet
		Comparator<String> com = new Comparator<String>(){
			@Override
			public int compare(String o1, String o2) {
				return Integer.compare(o1.length(), o2.length());
			}
		};
		TreeSet<String> ts = new TreeSet<>(com);
		//优化1:排序类使用匿名对象
		TreeSet<String> ts2 = new TreeSet<>(new Comparator<String>(){
			@Override
			public int compare(String o1, String o2) {
				return Integer.compare(o1.length(), o2.length());
			}
		});
	}

有lambda表达式之后

//现在的 Lambda 表达式
	@Test
	public void test2(){
		TreeSet<String> ts2 = new TreeSet<>((x, y) -> Integer.compare(x.length(), y.length()));
	}

是不是感觉非常的简洁,也不用写很多无用的代码了。其实我们关注的只是单单那一行。

Lambda表达式

Java8新特性(一)---Lambda表达式-LMLPHP

举例

用Runnable执行代码块
之前

Thread t = new Thread(new Runnable() {
	 public void run(){
	 	System.out.println("Hello world");
	 }
});

之后(用了Lambda表达式)

Thread t = new Thread(() -> System.out.println("Hello world"));

用Comparator进行排序
之前

Comparator<Apple> byWeight = new Comparator<Apple>() {
 public int compare(Apple a1, Apple a2){
 	return a1.getWeight().compareTo(a2.getWeight());
 }
};

之后(用了Lambda表达式)

Comparator<Apple> byWeight =  (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());

在第一次接触这个lambda表达式时可能感觉会有点别扭,但是不得不承认,代码看起来更清晰了!我们传递的只是比较苹果的重量或者关注的真正需要运行的代码。
总的来说,Lambda表达式免去了使用匿名方法的麻烦,给予Java强大的函数化编程的能力。

11-08 20:41