Java 8系列之Lamda的基本语法
Lamda的基本语法:
如果要理解Lamda表达式 , 需要先理解匿名内部类
lamda的三种形式:
a. (参数) -> 单行语句
b. (参数) -> {单行语句}
c. (参数) -> 表达式
一、参数的引用
a. 第一种形式: (参数) -> 单行语句
interface IMessage{ //a.单行语句:直接输出语句 public void print(String str); } public class LamdaTest { public static void main(String[] args) { //以前的写法: 匿名内部类 // fun(new IMessage() { // @Override // public void print() { // System.out.println("Hello"); // } // }); //Lamda表达式 //a.单行语句:首先要定义此表达式里面需要接收的变量,单行语句直接输出 fun((t) -> System.out.println(t)); } public static void fun(IMessage message){ message.print("Hello World"); } }
b. 第二种形式: (参数) -> {多行语句}
interface IMessage{ //a.单行语句:直接输出语句 public void print(String str); } public class LamdaTest { public static void main(String[] args) { //Lamda表达式 //多行语句: fun((t) -> { t = t.toUpperCase(Locale.ROOT); System.out.println(t); }); } public static void fun(IMessage message){ message.print("Hello World"); } }
c. 第三种形式: (参数) -> 表达式
interface IMessage{
//a.单行语句:直接输出语句
public int add(int x, int y);
}
public class LamdaTest {
public static void main(String[] args) {
//Lamda表达式
fun((s1, s2) -> s1 + s2);
}
public static void fun(IMessage msg){
System.out.println(msg.add(10, 20));
}
}
如果现在只是一个表达式, 那么进行操作的返回, 还是不写return比较合适, 是多行的是才可以考虑写return
fun((s1, s2) -> {return s1 + s2;});
二、方法的引用
方法引用在java8之中一共定义了四种形式:
? 引用静态方法: 类名称 :: static 方法名称
? 引用某个对象的方法: 实例化对象 :: 普通方法
? 引用特定类型的方法:特定类 :: 普通方法
? 引用构造方法:类名称 :: new
1. 引用静态方法
/** * 实现方法引用的接口 * param: P -- 引用方法的参数类型 * param: R -- 引用方法的返回类型 */ interface IMessage{ public R zhuanhuan(P p); } public class LamdaTest { public static void main(String[] args) { //即:将String.valueOf()方法变为了IMessage接口里的zhuanhuan()方法 IMessage
msg = String::valueOf; String str = msg.zhuanhuan(1000); System.out.println(str.replaceAll("0", "9")); } }
普通方法
@FunctionalInterface //此为函数式接口, 接口里面只能够定义一个方法 interface IDemo{ public R zhuanhuan(P p); }
特定类的对象支持
@FunctionalInterface //此为函数式接口, 接口里面只能够定义一个方法 interface IDemo{ public int compare(P p1, P p2); } public class LamdaMethodTest { public static void main(String[] args) { //即:将String.valueOf()方法变为了IMessage接口里的zhuanhuan()方法 IDemo
msg = String::compareTo; System.out.println(msg.compare("A", "B")); } }
引用构造方法:
@FunctionalInterface //此为函数式接口, 接口里面只能够定义一个方法 interface IDemo{ public C creat(String t, double p); } class Book{ private String title; private double price; public Book(String title, double price) { this.title = title; this.price = price; } @Override public String toString() { return "Book{" + "title='" + title + '\'' + ", price=" + price + '}'; } } public class LamdaMethodTest { public static void main(String[] args) { IDemo msg = Book::new; //引用构造方法
//调用的虽然是create(), 但是这个方法引用的是Book类的构造 Book book = msg.creat("Java开发", 20.2); System.out.println(book); } }