Java lambda尝鲜
最近Java 11都出来了,java 8 的很多新特性还没用过,比如接口可以有方法体啦,default默认方法。
当然最大的特性就是支持函数式编程了。Java 8 提供了lambda表达式和方法引用来支持函数式编程。
你要问我啥是函数式编程,我也不知道啊,我的理解大概就是跟匿名类有点像吧。可以用更少的代码
实现功能。增加代码可读性(我不这么认为啊,感觉更看不懂了。。。)
要想看懂lambda表达式,我们还需要了解一下函数式接口,啥是函数式接口呢?我母鸡啊,大概就是
只有一个抽象方法的接口吧。当然还有其他什么继承Object类的公有方法不算拉什么的大家自己百度去。
废话不多说,以前我们创建一个线程需要4行:
new Thread() { public void run() { System.out.println("hello"); } }.start();
现在:
new Thread(() -> System.out.println("hello")).start();
咦,我们的run方法呢,为啥可以不用重写run方法呢,因为Runnable是一个函数式接口,jvm自动搞定了。
可以看到Runnable接口上面多了一个注解,这个注解就是函数式接口了,这个接口只有一个抽象方法。
好了,上代码:
package com.test; import java.util.ArrayList; import java.util.List; /** * @program: java数据结构 * @description: lambda表达式demo * @author: Wu Lei * @create: 2018-10-24 15:23 */ public class LambdaTest {
static class Person { private int age; private String name; Person(int age, String name) { this.age = age; this.name = name; } int getAge() { return age; } void setAge(int age) { Person.this.age = age; } String getName() { return name; } public void setName(String name) { Person.this.name = name; } static int compareByAge(Person a, Person b) { return a.age - b.age; }//已经实现的compare 方法,可以使用方法引用,因为Comparetor是一个函数式接口 @Override public String toString() { return "Person{" + "age=" + age + ", name='" + name + '\'' + '}'; } } public static void main(String[] args) { new Thread(() -> System.out.println("hello")).start();//lambda方式创建一个线程 LambdaTest lt = new LambdaTest(); /* * 方法引用demo * */ List<Person> list = new ArrayList<>(); list.add(new Person(12, "jack")); list.add(new Person(8, "lily")); list.add(new Person(15, "lei")); list.add(new Person(7, "roma")); list.sort(Person::compareByAge);//方法引用 list.forEach(person -> System.out.println(person.getName()));//自己都看不懂了,牛逼 list.forEach(System.out::println);//需要重写toString()方法 } }