机房迁移以后终于可以用上 Java 8
了,本教程将会分为三个方面介绍Java 8
的新特性。首先给大家介绍 Java 8
的Lambda 表达式。
1. 让代码更灵活
作为程序员,每天除了写代码,最重要的事情就是吃饭了,为了吃饭,我们设计了一个Dish 对象,代码如下:
public classDish{
private final String name;
private final boolean vegetarian;
private final int calories;
private final Type type;
public enum Type {MEAT,FISH,OTHER}
//省略官网:www.fhadmin.org get set方法
}
作为一个减肥人士,寻求医生建议。医生说,低卡路里饮食,比较健康,为了找出卡路里低于1000的菜品。于是就有了一下代码:
public static List<Dish> filterDish(List<Dish> dishes){
List<Dish> healthDishes = new ArraryList<>();
for(Dish dish: dishes){
if(dish.getCalories()<1000){
healthDishes.add(dish)
}
}
}
后来医生说,不只卡路里要低,而且肉就不要吃了,吃素比较有利于健康,于是含泪写了以下代码:
public static List<Dish> filterDish(List<Dish> dishes){
List<Dish> healthDishes = new ArraryList<>();
for(Dish dish: dishes){
if(dish.getCalories()<1000 && dish.getVegerarian()){
healthDishes.add(dish)
}
}
}
不能吃肉哪憋得住,于是医生又说你可以吃一点鱼。最为一个有骨气的程序员,已经不想去迎合(产品经理了)医生去修改代码了官网:www.fhadmin.org?有没有什么办法,能快速找出健康食物,万一哪天减肥成功了,又能吃肉了也不用去修改代码?
于是我们写这样一段代码:
public static List<Dish> filterDish(List<Dish> dishes,int calorites,boolean isMeat,Type type){
List<Dish> healthDishes = new ArraryList<>();
for(Dish dish: dishes){
if(dish.getCalories()<calorites
&& dish.getVegerarian() == isMeat
&& dish.getType() == type ){
healthDishes.add(dish)
}
}
}
需求是满足了,但是作为一个有品位的程序员肯定不允许这样代码出现,实在过于繁琐了。万一再加入一个条件怎么办?
我们可以考虑将医生的医嘱作为一个方法传入我们的filerDish这个方法,医生说啥就是啥,不必要自己封装一个方法来响应医生的要求?于是我们这么考虑:
首先规定一个接口叫”医生说”:
public interfaceDoctorSaid{
booleantest(Dish dish);
}
我们挑选菜品的时候这样写:
public static List<Dish> filterDish(List<Dish> dishes,DoctorSaid doctorSaid){
List<Dish> lowCaloriesDishes = new ArraryList<>();
for(Dish dish: dishes){
if(doctorSaid.test(dish) ){
healthDishes.add(dish)
}
}
}
如果医生说吃 1000 卡路里一下的食物,我们实现一个1000 以下卡路里的食物:
public classDoctorSaidLowCaloritesimplementsDoctorSaid{
booleantest(Dish dish){
return dish.getCalorites() < 1000;
}
}
这样我们只用这样调用filterDish就解决问题了:
List<Dish> dishes = filterDish(dishes,new DoctorSaidLowCalorites());
问题来了,对于善变的(产品经理) 医生,总是不能提前准备好所有的接口实现?
这个时候我们就可以使用JAVA
的匿名了内部类来使用这个挑选菜品的方法更加灵活。于是我们就有这样的代码了
List<Dish> dishes = filterDish(dishes,new DoctorSaid(){
return dish.getCalorites() < 1000;
});
稍微好了一点,但是匿名内部类还是有一个不好的地方,就是太啰嗦了其实核心代码就是dish.getCalorites() < 1000
为什么我们要写那么多代码?这个也是java老被诟病的地方,代码十分繁琐。
终于我们的Lambda表达式要出场了:
List<Dish> dishes = filterDish(dish, (Dish dish)-> dish.getCalorites() < 1000);
现在看上去好多了,官网:www.fhadmin.org 但是作为一个程序员还是很贪心啊,现在只能过滤 Dish
能不能再抽象一点呢?当然啊,看这个:
public interfacePredicate<T>{
boolean test(T t);
}
public static <T> List<T> filter(List<T> list, Predicate<T> p){
List<T> result = new ArrayList<>();
for(T e: list){
if(p.test(e)){
result.add(e);
}
}
return result;
}
使用泛型让我们的代码更加通用。随便产品经理改需求,从 List 里面按规则过滤符合要求的需求不用多写代码都能搞定了。这时候你是不是觉得胸前的红领巾更加鲜艳了?
2. 实际应用:
作为一个招聘网站的程序员,一定有很多将职位列表排序的需求,比如按照更新时间将职位列表排序我们可以这么写:
jobList.sort((JobInfo job1,JobInfo job2)->job1.getUpdateTime.compareTo(job2.getUpdateTime);
或者作为高端程序员的多线程可以这样写:
Thread t = new Thread(()-> System.out.println("Hello world"));
3. 近距离观察Lambda
1. 什么是Lambda
所以通过上面例子我们尝试定义一下Lambda 表达式是什么?
Lambda表达式为简洁的表示可传递的匿名函数的表达式的一种方式。分开来说:
- 匿名:没有必要给他取一个函数名称。
- 简洁:相对于匿名内部内不需要写很多模板代码
- 传递:可以做为参数传递给方法
- 函数:不属特定类。但是和方法一样,有参数,函数主题,返回值,有时候还能抛异常。
标准的Lambda表达式:
(Dish dish) -> dish.getCalories() > 1000;
从上面的标准的表达式:一共三个部分组成
* 参数:
* 箭头:
* Lamdba主体:也就是函数的主体
2. 什么时候使用Lambda
- 函数式接口:
所谓函数式接口,我们可以理解为就是只有一个方法的接口。
- 函数描述符:
函数式接口的签名基本上就是Lambda表达式的签名。我们降这种抽象方法叫做函数描述符。举个例子,Ruannable 方法就可以看做一个什么都不接受,什么都不返回的函数。这个时候我们可以发现传入的 Lambda 函数为 ()->void
.
3. Lambda的类型推断
Java编译器会根据上下文推断使用什么函数式接口来配合Lambda表达式,比如我们之前的例子,以下两种写法都是正确的:
(Dish dish) -> dish.getCalories() > 1000;
dish -> dish.getCalories() > 1000;
第二个语句并没有显式的制定dish
的类型是Dish
,编译器也能正确的编译代码。
4.方法的引用
在Lambda中我们可以利用方法的引用来重复使用。可以认为是一个Lamdba带来的语法糖
相关推荐
1、函数式编程入门:通过阅读本源码资源,可以快速掌握Lambda表达式的基本语法和特性,为进一步学习函数式编程打下基础。 2、提高代码可读性:使用Lambda表达式可以减少样板代码,并使代码更加简洁和易读。本源码...
Java中的Lambda表达式是Java SE 8引入的一个关键特性,它是函数式编程风格的重要组成部分。在其他编程语言中,如Scala、Haskell等,Lambda表达式早已被广泛使用,但Java直到第八个版本才正式支持。Lambda表达式使得...
Java 8 引入了 Lambda 表达式,这是一种简洁的语法糖,使得函数式编程在 Java 中变得更为直观。Lambda 表达式是 Java 8 的核心特性之一,它简化了对那些只需要一个方法的接口(即 Functional Interface)的实现,...
Java Lambda表达式是Java 8中引入的一种新特性,它允许开发者使用更简洁的代码来创建只有一个抽象方法的接口(函数式接口)的实例。Lambda表达式主要作用就是代替匿名内部类的繁琐语法。 Lambda表达式由三部分组成...
Lambda表达式和stream流的入门 java 响应式编程
Java Lambda入门教程旨在引导开发者了解并掌握Java 8引入的一项重要特性——Lambda表达式。Lambda表达式是函数式编程的核心元素,它简化了代码,尤其是处理匿名内部类时的复杂性,使得Java语言更加简洁、易读。在这...
Java8通过引入Lambda表达式极大地简化了代码,并为Java语言带来了全新的编程范式。 **1.1 Lambda表达式的概念** Lambda表达式是一种可以直接使用的函数,它可以接受参数并返回结果。在Java中,Lambda表达式通常...
首先,Lambda表达式是Java语言中的一种函数引用,它允许我们将函数作为一个方法参数,或者作为一个新的数据类型(称为函数式接口)的实例。基本格式如下: ``` (parameters) -> expression ``` 这里的`parameters`...
Lambda表达式是Java 8中最核心的新特性之一,它允许开发者以更简洁的方式定义匿名函数。Lambda表达式的引入使得Java语言支持了更多的函数式编程特性,提高了代码的可读性和可维护性。例如,可以使用Lambda表达式来...
Lambda表达式是Java 8中引入的一种新的语法元素,用于实现函数式接口,即具有单一抽象方法的接口。Lambda表达式为Java添加了函数式编程的能力,使得开发者可以编写更简洁的代码,特别是在处理集合(Collection)和多...
1 Lambda表达式 2 1.1 Lambda语法糖 2 1.1.1 语法 2 1.1.2 Lambda表达式可使用的变量 3 1.1.3 lambda表达式中的this概念 3 1.2 函数式接口- Consumer/Predicate/Function/Supplier 4 1.1.4 什么是函数式接口 4 1.1.5...
Java8的高级编程特性之一是Lambda表达式。这是一种简洁的函数式编程风格,使得编写匿名函数变得更加直观和高效。Lambda允许你将一段功能作为参数传递给方法,或者将其作为返回值。这在处理集合数据时尤其有用,例如...
根据提供的文件信息,我们可以推断出这是一本关于Java编程语言的基础入门教程,由传智播客出版。虽然具体的PDF内容未给出,但从标题、描述和部分可见内容来看,本书主要面向初学者,旨在帮助他们掌握Java编程的基本...
本文将深入探讨Java 8的三大关键新特性:接口的默认方法实现、Lambda表达式以及一系列相关的变化。 一、接口的默认方法实现 在Java 8之前,接口只能定义抽象方法,而不能包含具体实现。Java 8引入了默认方法...
12. **Java 8特性**:如果这本书是较新的版本,应该会包含Java 8引入的lambda表达式、函数式接口、Stream API等特性。 13. **项目实践**:通过编写简单项目加深理解,如实现一个计算器、待办事项列表或者简单的游戏...
Lambda表达式是Java 8最重要的新特性之一,它允许以简洁的方式表示匿名函数。通过这种语法,开发者可以更方便地处理集合和函数接口,如Runnable、Comparator和Function。例如,`list.stream().filter(e -> e > 10)`...
Lambda表达式是Java8的核心特性之一,它允许我们将函数作为一个值来处理。Lambda表达式由三部分组成:参数列表、箭头符号和函数体。例如,`(int x, int y) -> x + y`是一个接受两个整数并返回它们之和的Lambda表达式...
首先,Java入门阶段,你会了解到Java的历史、特点以及它与C++等其他语言的对比。Java以其“一次编写,到处运行”的跨平台特性,吸引了众多开发者。此外,还会介绍Java的开发环境搭建,包括JDK的安装和配置,以及集成...