标签:printer case 调用 nts world runnable 方法 static 关键字
(形式参数) -> {代码块}
有一个接口并且接口中有且仅有一个抽象方法
interface MyInter {
void show();
}
public class Main {
public static void main(String[] args) {
myInterShow(() -> System.out.println("Hello,World"));
}
public static void myInterShow(MyInter mi) {
mi.show();
}
}
interface MyInter {
void show(String s);
}
public class Main {
public static void main(String[] args) {
myInterShow((s) -> System.out.println(s));
}
public static void myInterShow(MyInter mi) {
mi.show("Hello,World");
}
}
interface MyInter {
int show(int x, int y);
}
public class Main {
public static void main(String[] args) {
myInterShow((x, y) -> x + y);
}
public static void myInterShow(MyInter mi) {
int show = mi.show(10, 20);
System.out.println(show);
}
}
使用Lambda必须要有接口并且要求接口中有且仅有一个抽象方法
必须有上下文环境,才能推导出Lambda对应的接口
Runnable r = () -> System.out.println("Hello,World");
new Thread(() -> System.out.println("Hello,World")).start();
在使用Lambda表达式的时候,我们实际上传递进去的代码就是一种解决方案,拿参数做操作,如果我们在Lambda中所指定的操作方案,已经有地方存在相同方案,那是否还有必要再写重复逻辑呢?肯定是没必要,那我们又是如何使用已经存在的方案的呢?我们是通过方法引用来使用已经存在的方案
:: 该符号为引用运算符,而它所在的表达式被称为方法引用
方法引用可以根据上下文进行推导,方法引用是Lambda的孪生兄弟
使用说明:Lambda表达式被类方法替代的时候,它的形式参数全部传递给静态方法作为参数
interface Converter {
int convert(String s);
}
public class Main {
public static void main(String[] args) {
// Lambda写法
useConverter(s -> Integer.parseInt(s));
// 引用的方法
useConverter(Integer::parseInt);
}
private static void useConverter(Converter c) {
int number = c.convert("666");
System.out.println(number);
}
}
使用说明:Lambda表达式被类的实例方法替代的时候,第一个参数作为调用者,后面的参数全部传递给该方法作为参数
interface MyString {
String mySubString(String s, int x, int y);
}
public class Main {
public static void main(String[] args) {
// Lambda写法
useMyString((s, x, y) -> s.substring(x, y));
// 引用的方法
useMyString(String::substring);
}
private static void useMyString(MyString my) {
String s = my.mySubString("HelloWorld", 2, 5);
System.out.println(s);
}
}
使用说明:Lambda表达式被对象的实例方法替代的时候,它的形式参数全部传递给该方法作为参数
class PrintString {
public void printUpper(String s) {
String result = s.toUpperCase();
System.out.println(result);
}
}
interface Printer {
void printUpperCase(String s);
}
public class Main {
public static void main(String[] args) {
// Lambda写法
usePrinter(s -> System.out.println(s.toUpperCase()));
// 引用的方法
PrintString ps = new PrintString();
usePrinter(ps::printUpper);
}
private static void usePrinter(Printer p) {
p.printUpperCase("HelloWorld");
}
}
使用说明:Lambda表达式被构造器替代的时候,它的形式参数全部传递给构造器作为参数
class Student {
private String name;
private int age;
public Student() {}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
interface StudentBuilder {
Student build(String name, int age);
}
public class Main {
public static void main(String[] args) {
// Lambda写法
useStudentBuilder((name, age) -> new Student(name, age));
// 引用的写法
useStudentBuilder(Student::new);
}
private static void useStudentBuilder(StudentBuilder sb) {
Student s = sb.build("林青霞", 30);
System.out.println(s.getName() + "," + s.getAge());
}
}
标签:printer case 调用 nts world runnable 方法 static 关键字
原文地址:https://www.cnblogs.com/caochenlei/p/13340518.html