《笔者带你剖析Java8的lamda表达式01》
其实Java8从诞生到至今,3年多的时间里笔者一直没有在任何项目中正式使用到Java8和lamda。时光飞逝,当我们还停留在Java6和Java7的语法层面时,9的正式版也即将来到我们身边,真的是感觉到惭愧,所以笔者抽空整理了一下lamda的一些表达式语法,同时也准备在项目中柔和进它。
首先我们来看看,使用Lamda有什么好处,没好处的事情相信谁也不愿意牺牲稳定性去尝鲜。lamda对语法层面的改变2个字总结就是:简洁。因此可以把lamda表达式理解为简洁的表示可传递的匿名函数的一种方式。
lamda的构成,如下所示:
图1 lamda表达式的构成结构
lamda表达式的构成结构由3部分构成,首先是lamda的参数列表,其次是箭头符号,最后是lamda的函数主体。那么看到现在,我们先来点实在的东西,如何使用Lamda表达式,思考一下,在Java8之前,我们使用线程的时候,大部分情况下,都是通过匿名类的的方式进行实现,那么看看如何使用lamda表达式进行改造:
/* 匿名类的用法 */ new Thread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getId()); } }).start(); /* lamda用法 */ new Thread(() -> System.out.println(Thread.currentThread().getId())).start();
你的第一感觉是什么?反正我的感觉清爽和简洁,因为再也不必要那浪费时间去编写样板代码。你可能会产生疑问,如果我的函数主体由多行构成的时候应该怎么办呢?lamda表达式的基本语法如下:
Runnable t1 = () -> System.out.println(Thread.currentThread().getId()); /* 如果函数主体由多行构成,则使用花括号{} */ Runnable t2 = () -> { for (int i = 0; i < 10; i++) { // ... } };
学了新技能,就要考虑在哪里能够欢快的使用,lamda可以使用在函数式接口上。函数式接口眨一听,略带抽象,简单来说,就是一个被定义了@FunctionalInterface注解且仅包含一个抽象方法的接口,这就是所谓的函数式接口,那么被@FunctionalInterface注解标记的接口如果包含了2个抽象方法,编译器会告知“Invalid '@FunctionalInterface' annotation; CompareObj is not a functional interface”。
当然函数式接口中的抽象方法也被称之为函数描述符,因为接口中抽象方法的方法签名基本上就是lamda表达式的签名。你试想一下,如果一个函数式接口中包含N个抽象方法,我们在使用lamda表达式时,编译器如何区lamda表达式的签名应该对应哪一个方法签名呢?
@FunctionalInterface public interface CompareObj { public boolean compare(); public boolean compare2(); /* CompareObj comObj=()->true;编译器如何清楚所对应的具体方法? */ }
再回到函数式接口这个话题,刚才笔者也说了,被@FunctionalInterface标记的接口我们可以称之为函数式接口,但这个注解并不是必须的(Java8中Runnable以及Callable等接口已经标注了该注解),但好的编码习惯只会对实际的开发过程中带来意想不到的帮助。那么接下来我们就来定义一个函数式接口,并在它上面使用Lamda表达式:
@FunctionalInterface public interface Compare { public boolean compare(String str1, String str2); /* Java8允许接口中定义实现 */ public static void main(String[] args) { testCompare((String str1, String str2) -> str1.equals(str2), "a", "b"); } public static boolean testCompare(Compare c, String str1, String str2) { return c.compare(str1, str2); } }
除了可以自定义函数式接口,Java8 API也为开发人员提供了一些较为常用和常见的函数式接口:Predicate、consumer、Funtion,这些接口都被包含在java.util.funtion包下。
当然笔者并不会全部对这些接口进行介绍,感兴趣的同学可以自行研究其用法,笔者仅挑 Predicate<T>接口进行演示。在该接口中包含一个返回值为boolean类型的test()的抽象方法,我们可以使用该函数式接口来验证一个涉及类型为T的布尔表达式,如下所示:
Predicate<String> p = (String str) -> StringUtils.isEmpty(str); System.out.println(p.test("lamda"));
相关推荐
本课程主要针对于Java 8(JDK 1.8)的新特性Lamda表达式进行了全面讲解。讲解了java基于函数编程的语法,以及与Lamda表达式操作有关的内建接口、批处理、MapReduce数据分析汇总处理。
Java 8 是一个重要的Java平台版本,因为它引入了许多新特性,其中最显著的就是Lambda表达式。Lambda表达式是函数式编程的关键元素,它允许我们以更简洁、更易读的方式编写代码,特别是在处理集合和并发任务时。在这...
### 如何使用Lambda表达式 #### Lambda表达式简介 Lambda表达式是一种简洁的、内联方式定义函数的方法,常用于创建匿名函数。这种表达式在许多编程语言中都有应用,尤其是在支持面向对象或函数式编程的语言中更为...
C# Lamda表达式简单运用
8. **异步编程**:在C# 5.0及更高版本中,Lambda表达式与`async`和`await`关键字结合,可实现异步方法。例如: ```csharp public async Task<string> DownloadAsync(string url) => await client.GetStringAsync...
**Lambda表达式(LAMDA Expression)** Lambda表达式是C# 3.0引入的新特性,它提供了一种更简洁的方式来表示匿名方法。Lambda表达式使用“=>”操作符,左边是输入参数(如果有的话),右边是表达式或语句块。Lambda...
Lambda表达式是Java 8中引入的一个重要新特性,它允许开发者以一种更加简洁的方式编写函数式接口实现代码。Lambda表达式本质上是一个匿名函数,能够作为一个参数传递给方法调用或存储在变量中,这使得Java支持了更高...
### Java 8 Lambda 表达式之函数式接口详解 #### 一、引言 Java 8 的引入带来了一系列重大的变化,其中 Lambda 表达式作为最具革命性的特性之一,极大地简化了代码编写,提高了程序的可读性和可维护性。在前两篇...
jdk1.8的特性
随着技术的发展,开发者们探索出一种新的方式来实现路由功能——基于Lamda表达式的强类型Routing。 首先,传统的路由注册方式是通过在路由配置文件RouteConfig.cs中使用MapRoute方法来定义路由模板。然而,随着MVC ...
在C#编程语言中,匿名函数和Lambda表达式是两种非常重要的特性,它们极大地提高了代码的简洁性和可读性。本压缩包中的源代码详细展示了这两种技术的使用方法,并且带有注释,方便理解。 首先,让我们来了解一下匿名...
### Lambda 表达式及其在 C# 中的应用 在 C# 的高级编程中,Lambda 表达式的理解和应用是至关重要的。随着 C# 4.0 的推出,一系列新的编程特性如 LINQ 和 Lambda 表达式等为开发者提供了更多便利和强大的功能。本文...
在 Java 8 中,Lambda 表达式可以与 Stream API 结合使用来实现循环累加求和操作。下面是一个简单的示例代码: ```java public void test() { List<Person> people = new ArrayList(); people.add(new Person(...
【C++ function、bind及lambda表达式】 C++0x引入了多项新特性,其中lambda表达式、std::function对象和bind机制是提升代码灵活性和可读性的重要工具。这三者之间的紧密联系在于它们都能在处理回调函数时提供便利。...
Lambda表达式是Java 8引入的一种新特性,它极大地简化了函数式编程,使得代码更加简洁、优雅。在本文中,我们将深入探讨Lambda表达式的概念、语法以及如何在实际编程中应用它们,以实现高效、易读的代码。 首先,...
lamda出来很久了最近老师说用lamda表达式来做一个Button的按钮事件,初略的将自己的做法和感想分享给大家 先说 AS 如何支持 Lambda 表达式 1.首先确定你的AndroidStudio中使用的是大于jdk1.8的版本 2、在项目的根...
在本文中,我们将深入探讨Qt库中的线程池(Thread Pool)机制,以及如何结合使用信号槽(Signals and Slots)和跨线程的lambda表达式。这些技术在多线程编程中扮演着至关重要的角色,特别是在GUI应用中,能够帮助...