`
gao_xianglong
  • 浏览: 467060 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

剖析Java8的lamda表达式03

阅读更多

《剖析Java8的lamda表达式03》

 

前面几个章节笔者对lamda表达式的语法进行了详细的讲解,那么本章也是最后一章,一来是做一些总结,但更多是lamda表达式的一些实战性相关的案例,毕竟清楚语法,不清楚怎么用,在哪里用,将会是一个很悲催的事情。

 

先来首先来看看一个排序操作,比如我们想对一个List集合执行字典排序,那么Java8之前最常见的做法就是编写匿名类,当然我们既然已经学习了lamda,就应该学而用之:

List<Double> list = Arrays.asList(3.5D, 2.7D, 1.65D);
/* 使用匿名类进行字典排序 */
Collections.sort(list, new Comparator<Double>() {
	@Override
	public int compare(Double a, Double b) {
		return a.compareTo(b);
	}
});
System.out.println(list);
/* 使用lamda表达式进行排序 */
Collections.sort(list, (a, b) -> a.compareTo(b));
System.out.println(list);
Collections.sort(list, (a, b) -> {
	return b.compareTo(a);
});
Collections.sort(list, Comparable::compareTo);
System.out.println(list);

 

 之前笔者曾经以及过,Java8为大家提供了Predicate、consumer、Funtion等函数式接口,那么接下来,笔者就统一对其进行演示:

/* 支持布尔类型表达式的Predicate函数式接口 */
Predicate<String> predicate = (str) -> str.isEmpty();
System.out.println(predicate.test("JohnGao"));
predicate = (str) -> str.startsWith("J");
System.out.println(predicate.test("JohnGao"));
/* 支持将入参信息映射到出参的Function函数式接口 */
Function<String, Integer> function = (str) -> Integer.valueOf(str);
System.out.println(function.apply("123"));
function = Integer::valueOf;
System.out.println(function.apply("321"));
function = (str) -> {
 int result = -1;
 if (str.matches("[0-9]+")) {
  result = Integer.valueOf(str);
 }
 return result;
};
System.out.println(function.apply("test123"));
/* 无返回值的consumer函数式接口 */
Consumer<String> consumer = System.out::println;
consumer.accept("lamda");
Consumer<List<Integer>> consumer2 = (list) -> {
 list.forEach((Integer i) -> {
  if (i % 2 == 0)
   System.out.println(i);
 });
};
consumer2.accept(Arrays.asList(1, 3, 5, 7, 9, 8, 10, 20));

 

 Java5的API中为大家带来了for-each语法,简化了数组、集合的迭代操作,但Java8对集合类型提供有forEach()函数,让大家可以更专注于业务:

List<String> list = Arrays.asList("a", "b", "c");
/* java5之前的迭代方式 */
for (int i = 0; i < list.size(); i++)
 System.out.println(list.get(i));
Iterator<String> iterator = list.iterator();
while (iterator.hasNext())
 System.out.println(iterator.next());
for (iterator = list.iterator(); iterator.hasNext();) {
 System.out.println(iterator.next());
}
/* java5之后的foreach迭代方式 */
for (String str : list)
 System.out.println(str);
/* java8后结合lamda表达式迭代方式 */
list.forEach(!list.isEmpty() ? System.out::println : null);
list.forEach((str) -> System.out.println(str));
Map<String, String> map = new HashMap<String, String>();
for (int i = 1; i <= 10; i++)
 map.put("key" + i, "value" + i);
map.forEach((str1, str2) -> {
 System.out.println(str2);
});

 

 这里有个有趣的案例,在java8之前,我们对集合中元素求和、最大值、最小值,一直采用的是比较蛋疼的写法,但结合lamda表达式和函数式编程,将会变得有趣:

List<Integer> list = Arrays.asList(1, 12, 45, 78, 100, 500);
int max = list.get(0);
int min = max;
/* 早期求最大值和最小值写法 */
for (Integer i : list) {
 max = max < i ? max = i : max;
 min = min > i ? min = i : min;
}
System.out.println("min-->" + min + "\nmax-->" + max);
/* 结合流lamda表达式 */
IntSummaryStatistics stats = list.stream().mapToInt(Integer::new).summaryStatistics();
System.out.println("sum-->" + stats.getSum() + "\navg-->" + stats.getAverage() + "\nmax-->" + stats.getMax()
  + "\nmin-->" + stats.getMin() + "\ncount-->" + stats.getCount());

 

分享到:
评论

相关推荐

    学习Java 8【Lamda表达式开发】免费视频

    本课程主要针对于Java 8(JDK 1.8)的新特性Lamda表达式进行了全面讲解。讲解了java基于函数编程的语法,以及与Lamda表达式操作有关的内建接口、批处理、MapReduce数据分析汇总处理。

    java8lambda表达式Demo

    Java 8 是一个重要的Java平台版本,因为它引入了许多新特性,其中最显著的就是Lambda表达式。Lambda表达式是函数式编程的关键元素,它允许我们以更简洁、更易读的方式编写代码,特别是在处理集合和并发任务时。在这...

    如何使用Lamda表达式

    ### 如何使用Lambda表达式 #### Lambda表达式简介 Lambda表达式是一种简洁的、内联方式定义函数的方法,常用于创建匿名函数。这种表达式在许多编程语言中都有应用,尤其是在支持面向对象或函数式编程的语言中更为...

    C# Lamda表达式简单运用

    C# Lamda表达式简单运用

    lamda表达式.rar

    8. **异步编程**:在C# 5.0及更高版本中,Lambda表达式与`async`和`await`关键字结合,可实现异步方法。例如: ```csharp public async Task&lt;string&gt; DownloadAsync(string url) =&gt; await client.GetStringAsync...

    委托匿名方法LAMDA表达式

    **Lambda表达式(LAMDA Expression)** Lambda表达式是C# 3.0引入的新特性,它提供了一种更简洁的方式来表示匿名方法。Lambda表达式使用“=&gt;”操作符,左边是输入参数(如果有的话),右边是表达式或语句块。Lambda...

    Java系列JDK 1.8 新特性之 Lambda表达式.pdf

    Lambda表达式是Java 8中引入的一个重要新特性,它允许开发者以一种更加简洁的方式编写函数式接口实现代码。Lambda表达式本质上是一个匿名函数,能够作为一个参数传递给方法调用或存储在变量中,这使得Java支持了更高...

    lamda表达式 part3

    ### Java 8 Lambda 表达式之函数式接口详解 #### 一、引言 Java 8 的引入带来了一系列重大的变化,其中 Lambda 表达式作为最具革命性的特性之一,极大地简化了代码编写,提高了程序的可读性和可维护性。在前两篇...

    jdk1.8 lamda表达式_stream.md

    jdk1.8的特性

    解读ASP.NET 5 & MVC6系列教程(12):基于Lamda表达式的强类型Routing实现

    随着技术的发展,开发者们探索出一种新的方式来实现路由功能——基于Lamda表达式的强类型Routing。 首先,传统的路由注册方式是通过在路由配置文件RouteConfig.cs中使用MapRoute方法来定义路由模板。然而,随着MVC ...

    C#源代码-匿名函数和lamda表达式的写法.zip

    在C#编程语言中,匿名函数和Lambda表达式是两种非常重要的特性,它们极大地提高了代码的简洁性和可读性。本压缩包中的源代码详细展示了这两种技术的使用方法,并且带有注释,方便理解。 首先,让我们来了解一下匿名...

    lamda表达式

    ### Lambda 表达式及其在 C# 中的应用 在 C# 的高级编程中,Lambda 表达式的理解和应用是至关重要的。随着 C# 4.0 的推出,一系列新的编程特性如 LINQ 和 Lambda 表达式等为开发者提供了更多便利和强大的功能。本文...

    Java lambda 循环累加求和代码

    在 Java 8 中,Lambda 表达式可以与 Stream API 结合使用来实现循环累加求和操作。下面是一个简单的示例代码: ```java public void test() { List&lt;Person&gt; people = new ArrayList(); people.add(new Person(...

    C++ function、bind以及lamda表达式

    【C++ function、bind及lambda表达式】 C++0x引入了多项新特性,其中lambda表达式、std::function对象和bind机制是提升代码灵活性和可读性的重要工具。这三者之间的紧密联系在于它们都能在处理回调函数时提供便利。...

    lamda 优美表达式 可作为仿照的案例demo

    Lambda表达式是Java 8引入的一种新特性,它极大地简化了函数式编程,使得代码更加简洁、优雅。在本文中,我们将深入探讨Lambda表达式的概念、语法以及如何在实际编程中应用它们,以实现高效、易读的代码。 首先,...

    AS用lamda表达式制作一个简单的butoon事件

    lamda出来很久了最近老师说用lamda表达式来做一个Button的按钮事件,初略的将自己的做法和感想分享给大家 先说 AS 如何支持 Lambda 表达式 1.首先确定你的AndroidStudio中使用的是大于jdk1.8的版本 2、在项目的根...

    Qt thread pool 线程池样例,信号槽,跨线程 lambda

    在本文中,我们将深入探讨Qt库中的线程池(Thread Pool)机制,以及如何结合使用信号槽(Signals and Slots)和跨线程的lambda表达式。这些技术在多线程编程中扮演着至关重要的角色,特别是在GUI应用中,能够帮助...

Global site tag (gtag.js) - Google Analytics