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()方法 } }

 

posted @ 2018-10-25 11:26  夜雨最萌  阅读(152)  评论(0编辑  收藏  举报