jdk8 新特性(二) Lambda表达式的使用,方法的引用

jdk8 新特性(二) Lambda表达式的使用,方法的引用

上篇文章 我们介绍了 接口中default与static关键字 (https://blog.csdn.net/weixin_43727535/article/details/103490701)下面我们看一下lambda表达式

上篇文章我们定义了FunctionalUserInterface 函数,回顾一下:

@FunctionalInterface
public interface FunctionalUserInterface {

    void addUser(String userName,String password);

    @Override
    boolean equals(Object obj);

    default void defaultUser(){
        System.out.println("default");
    }

    static void staticUser(){
        System.out.println("static");
    }
}

那么问题来了,接口是不能用 new 创建对象的,如果在没有子类的情况下,如何调用我们接口中的方法呢?

1.jdk1.8之前我们使用匿名内部类形式调用

public class Test {
    public static void main(String[] args) {
        FunctionalUserInterface functionalUserInterface = new FunctionalUserInterface() {
            @Override
            public void addUser(String userName, String password) {
                System.out.println("userName = " + userName + ",password = " + password);
            }
            @Override
            public boolean equals(Object obj) {
                return false;
            }
        };
        functionalUserInterface.addUser("张三","123456");
    }
}

运行效果:
在这里插入图片描述
2.使用Lambda表达式形式调用

FunctionalUserInterface user = (userName,password) -> {
    System.out.println("使用Lambda 输出 :userName = " + userName + ",password = " + password);
};
user.addUser("张三","123456");

运行效果:
在这里插入图片描述
从上面的案例中我们可以体验到 Lambda 表达式使用可以大大减少代码量,那么Lambda表达式如何使用呢?我们一起来看一下吧!

Lambda 使用方法

语法 : (参数列表)左边 -> 主题

创建待返回参数的方法如下:

@FunctionalInterface
public interface FunctionalUserInterface1 {
    String getName();
}
用Lambda表达式调用:
FunctionalUserInterface1 user = () -> "李四";
String name = user.getName();
System.out.println(name);
运行效果:

在这里插入图片描述

实际项目如何使用jdk1.8优化之前的代码

1.多线层的使用

之前代码

public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("子线层名称:" + Thread.currentThread().getName());
            }
        };
        new Thread(runnable).start();
    }

使用Lambda 表达式

public static void main(String[] args) {
    Runnable runnable = () -> {
        System.out.println("子线层名称:" + Thread.currentThread().getName());
    };
    new Thread(runnable).start();
}

还可以写成这样

public static void main(String[] args) {
    new Thread(() -> {
        System.out.println("子线层名称:" + Thread.currentThread().getName());
    }).start();
}

2.for循环

public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<>();
    list.add("11");
    list.add("22");
    list.add("33");
    //传统方式
     list.forEach(new Consumer<String>() {
        @Override
        public void accept(String s) {
            System.out.println(s);
        }
    });
    System.out.println("************************");
    //lambda 表达式
    list.forEach((t) ->{
        System.out.println(t);
    });
    System.out.println("************************");
    //forEach
    for (String s : list) {
        System.out.println(s);
    }
    //方法引用
    list.forEach(System.out::println);
}

Lambda表达式有那些有缺点

优点:代码简单、可能代表未来的编程趋势。
缺点:不容易调试,若其他程序员没有学过 lambda 表达式,代码不容易让其他语言的程序员看懂

学习更多 http://www.mayikt.com/

猜你喜欢

转载自blog.csdn.net/weixin_43727535/article/details/103496050
今日推荐