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/