Lambda表达式是Java 8引入的新特性,是一种函数式编程的概念。它可以使代码更加简洁,并且提高代码的可读性和可维护性。
Lambda表达式是一种匿名函数,它没有名称,但可以被看作是函数的一种简写形式。Lambda表达式主要由两部分组成:参数列表和函数体。其中,参数列表定义了方法可以接受的参数类型和数量,而函数体则是执行该方法的代码块。
Lambda表达式的语法格式如下:
(p1, p2, …, pN) ->; expression
或
(p1, p2, …, pN) ->; { statements; }
其中,第一个部分是参数列表,用括号括起来;箭头->;用于连接参数列表和函数体,意思是“执行”;第二个部分是函数体,可以是表达式或一个代码块。
Lambda表达式使用时可以替代匿名内部类的写法,常用于函数式接口的实现。例如:
Zoo dog = () ->; System.out.println("汪汪队");
Work w = new Work();
w.move();
这个例子中,使用了Lambda表达式替代了接口的匿名内部类的实现,使代码更加简洁,并且容易读懂。
使用Lambda表达式实现函数接口的步骤如下:
-
定义一个函数式接口,该接口只有一个抽象方法;
-
在调用时,使用Lambda表达式直接实现该接口的抽象方法
此外,Lambda表达式可以使用方法引用来代替Lambda表达式中的代码,使得代码更加简洁。方法引用是指用方法的名字来代替Lambda表达式,它只适用于那些只调用一个方法的Lambda表达式。在Java中有四种类型的方法引用 :
-
引用静态方法:类名::方法名
-
引用实例方法:对象引用::方法名
-
引用构造方法:类名::new
-
引用成员方法:类名::方法名
接下来是一些例子供参考
1.引用静态方法时
import java.util.Arrays;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<String> words = Arrays.asList("hello", "world", "java", "lambda");
// 使用Lambda表达式和静态方法引用筛选长度大于5的字符串
words.stream().filter(Test::judge).forEach(System.out::println);
}
public static boolean judge(String s) {
return s.length() > 5;
}
}
这个例子中,我们首先创建了一个包含一组整数的列表words。然后,我们使用stream()方法将该列表转换成流对象。接着,我们使用filter()方法对流中的元素进行筛选,表示如果元素长度大于5,则返回true。最后,我们使用forEach()方法将符合条件的元素输出到控制台上。
(流对象(Stream)像一个加工工厂的流水线,把未加工的物料(集合、数组、文件等)进行不同的处理变成了加工好的成品。将原始数据源输入,经过中间流操作,再输出一份新的、经过处理后的数据流,这个数据流包含了我们需要的处理结果)
2.引用实例方法
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
}
List<Person> persons = new ArrayList<>();
persons.add(new Person("张三", 30));
persons.add(new Person("李四", 20));
persons.add(new Person("王五", 25));
Collections.sort(persons, Comparator.comparing(Person::getAge));
for (Person person : persons) {
System.out.println(person.getName() + " " + person.getAge());
}
其中,Person::getAge就是引用动态方法的方式,表示对person对象的年龄属性进行比较。