干货 JDK1.8 Lambda表达式详细介绍和使用以及如何自定义Lambda

一:简介

JDK的升级的目的有以下几个:增加新的功能、修复bug、性能优化、简化代码等几个方面,Lambda表达式就是属于简化代码,用于简化匿名实现类,提供一种更加简洁的写法。Lambda表达式在Swift语言中称之为代码块,Lambda表达式可以认为是一种特殊的接口,该接口必须只有一个抽象方法。


干货 JDK1.8 Lambda表达式详细介绍和使用以及如何自定义Lambda


语法

<code>(参数类型 参数名, 数参数类型 参数名2...) -> { 
// code
};
/<code>

小括号()中的内容就是方法中的参数列表包括参数类型、参数名,其中参数类型是可以省略的,当参数个数只有一个时也可以省略掉小括号; 花括号{}中的内容就是方法中的方法体,当方法体中只有一行代码时可以省略{},当方法体中只有一行代码并且需要返回值时也可以省略掉return; 由于Lambda表达式是匿名实现类的简写,是一种特殊的接口,当赋值给一个变量时也少不掉分号;

Lambda表达式的作用

  • 简化匿名实现类的书写
  • 作为函数中的参数来传递

二:示例

示例1:两个参数,一个返回值

IHello 一个很普通的接口,但接口中只能有一个抽象方法

<code>public interface IHello {
String sayHello(String name, String msg);
}
/<code>

Main

<code>public class Main {
public static void main(String[] args) {
// 将一个Lambda表达式赋值给一个接口,说明Lambda表达式就是一种接口数据类型,只不过该接口只能有一个抽象方法
// 参数列表可以省略参数类型,可以写成(name, msg),
// 在JDK1.8中有个叫做类型推断的东西,可以自动推断出参数的类型,
// 因为IHello中只有一个抽象方法,知道方法了就知道参数列表了,从而就能推出参数类型来
IHello iHello = (String name, String msg) -> {
String hello = name + ": " + msg;
return hello;
};
// 调用接口的方法
String content = iHello.sayHello("mengday", "happy new year everyone!");
System.out.println(content);
}
}
/<code>

示例2:一个参数,一个返回值

<code>public interface IHello {
String sayHello(String name);
}
/<code>

Main

<code>public class Main {
public static void main(String[] args) {
// 参数列表可以省略参数类型,当只有一个参数时可以省略小括号 (String name) --> (name) --> name
// 当方法体中只有一行代码并且有返回值时可以同时省略花括号和return
// { return name + ": " + "happy new year everyone!";} --> name + ": " + "happy new year everyone!";
IHello iHello = name -> name + ": " + "happy new year everyone!";

String content = iHello.sayHello("mengday");
System.out.println(content);
}
}
/<code>

示例3:没有参数,没有返回值

<code>public interface IHello {
void sayHello();
}
/<code>
<code>public class Main {
public static void main(String[] args) {
// 当表达式没有参数时一对小括号是不能省略掉的
IHello iHello = () -> System.out.println("mengday: happy new year everyone!");
iHello.sayHello();
}
}
/<code>

从这三个示例中我们发现我们只定义了接口,并没有定义实现类,而是通过Lambda表达式来代替了实现类。 注意:Lambda接口只能有一个抽象方法,可以同时拥有多个静态方法和默认方法。


示例4:Lambda表达式参数

<code>public interface IHello {
void sayHello(String name);
}
/<code>
<code>public class Main {

public static void sayHello(IHello iHello, String name) {
iHello.sayHello(name);
}

public static void main(String[] args) {

IHello iHello = name -> {
String content = name + ": " + "happy new year everyone!";
System.out.println(content);
};

// 这里可以把iHelo看成一个匿名实现类来传递参数
sayHello(iHello, "mengday");

// 如果去掉变量的接收,直接将Lambda表达式传递到参数中,此时Lambda表达式更像是一个函数
// 也就是说JDK1.8竟然可以将一个函数作为参数传递到方法中,这是之前版本做不到的
// 将函数作为方法的参数传递,一般用于回调函数,将回调函数传递到方法中
sayHello(name -> {
String content = name + ": " + "happy new year everyone!";
System.out.println(content);
}, "mengday");
}
}
/<code>

示例5:集合排序示例

<code>public static void main(String[] args) {

// 写法一:使用匿名内部类
// 好好学习,天天向上
List<string> words = Arrays.asList("good", "good", "study", "day", "day", "up");

// public static void sort(List list, Comparator super T> c)
Collections.sort(words, new Comparator<string>() {
@Override
public int compare(String s1, String s2) {
// 降续排序
return s2.compareTo(s1);
}
});

System.out.println(words);


// 写法二:使用Lambda表达式
// 咱俩谁跟谁
words = Arrays.asList("we", "two", "who", "and", "who");
Collections.sort(words, (String s1, String s2) -> {return s2.compareTo(s1);});
System.out.println(words);


// 写法三:使用Lambda表达式(简写)
// 有事起奏,无事退朝
words = Arrays.asList("if", "you", "have", "something", "to", "say", "then", "say!",
"if", "you", "have", "nothing", "to", "say", "go", "home!");
Collections.sort(words, (s1, s2) -> s2.compareTo(s1));
System.out.println(words);
}/<string>
/<string>/<code>


分享到:


相關文章: