其他优势
1.Lambda表达式代码简洁,意图明确,比如使用stream接口代替for循环,只需要书写一行代码就能解决
2.多核友好:Java 函数式编程自带编写并行程序的方法,只需调用parallel方法即可使程序并行
面向对象的束缚
在创建一个线程时需要new一个可以执行类的对象传入到线程中,但我们只想要这个线程做一件事情,把关注点从怎么做,回归到我们实际要做什么的本质上,实现目的的过程并不重要
如上,为了完成需求,需创建一个 Runnable 接口的匿名内部类对象来给 Thread 对象指定任务内容,再启动该线程。创建匿名内部类对象不是我们的本意,只是面向对象的思想让我们不得不创建一个匿名内部类对象来完成咱们的需求。
这段代码和刚才的执行效果是完全一样的。从代码的语义中可以看出:我们启动了一个线程,而线程任务的内容以 一种更加简洁的形式被指定。瞬间感觉得到了解放!不再有“不得不创建 Runnable接口对象”的束缚,不再有“覆盖重写抽象方法”的负担,就是这么简单!
Java8 新特性体验
如果是一个函数式接口(接口中有且只有一个抽象方法),那么一些确定的东西即可不必表现出来,只需写出不确定的代码
//工具类静态方法
private static List<Product> findPhoneByCondition(List<Product> products, MyPredicate predicate){
List<Product> productList = new ArrayList<>();
for (Product product : products) {
if (predicate.test(product)) {
productList.add(product);
}
}
return productList;
}
//函数接口
public interface MyPredicate {
boolean test(Product product);
}
//使用
需求1: 工具类.findphoneByCondition(products,p -> p.getName().contains("手机"))
需求2: 工具类.findphoneByCondition(products,p -> p.getPrice() > 1000)
Lambda语法
1.可选声明类型:不需要声明参数类型,编译器可以统一识别参数值
s -> System.out.println(s)
2.可选的参数圆括号():一个参数无需定义圆括号,但多个参数需要定义圆括号,让这些参数成为一个整体的参数列表
s -> System.out.println(s)
(x,y) -> System.out.println(x+y)
3.可选的大括号{}: 如果语句体只有一句语句,则可以不用{}
4.可选的返回关键字return: 如果语句体只有一句语句并且是要返回的结果,则可以省略return关键字和{}
函数式接口
常见的函数式接口
Consumer(消费型接口): void accept(T t) 特点:传入一个参数,在方法体里操作完,没有返回值
supplier(供给型接口): T get() 特点:不需要参数,返回一个你要生产的对象
Function(函数型接口): R apply(T t) 特点:传入一个任意类型对象,返回任意类型对象
Predicate(断言型接口): boolean test (T t) 特点:传入一个T类型参数,返回布尔值类型结果,适合做对该参数条件判断
方法引用
语法分析
Lambda表达式的延迟执行
public static void main(String[] args) {
String name = "张无忌"; String action="夜店消费"; String money = "20000元";
// 立即拼接字符串
logMethod("info",name + action + money);
}
private static void logMethod(String info, String s) {
if ("info".equals(info)) {
System.out.println(s);
}
}
public static void main(String[] args) {
String name = "张无忌"; String action="夜店消费";
String money = "20000元";
// 延迟拼写字符串
logLambdamethod("info",()->{ System.out.println("come in");
return name + action+money; });
}
private static void logLambdamethod(String level, supplier<String> sup) {
//符合条件才调用接口里的方法返回拼接的字符串
if ("info".equals(level)){
System.out.println("come in");
System.out.println(sup.get());
}
}
更强大的接口
在JDK 1.7及更老的版本中,接口中只能包含常量与抽象方法两种内 容,不允许包含其他。但是这种情况在JDK 1.8中已经改变:接口中允许包含default方法和static方法并指定方法体的具体实现。
default/static修饰方法
接口冲突
总结
每个接口类型,引用一个匿名实现类,实现接口的方法,再通过接口对象调用实现类的方法,Lambda表达式就是对这个匿名类及实现的简化过程
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。