本文翻译自《Java 8 Explained: Applying Lambdas to Java Collections》。
Lambdas表达式是Java 8的主题,在Java平台上我们期待了很久。但是,如果如果我们不在集合中使用它的话,就损失了很大价值。把现有接口迁移成为lambda风格接口的问题已经通过default methods,也就是defender methods解决了。在这篇文章里面我们来看一看Java集合里面的批量数据操作(bulk operation)。
批量操作
最初的变更文档已经说了,批量操作是“给Java集合框架添加的用以批量操作数据的功能,而它是基于lambda函数实现的”。引用的话也就是在说,lambda移植到Java 8对我来说的实际目的,就是它提供了一种新的使用集合的方式,这也是最重要的特性,表达式操作符可以并行执行,并且lambda是一个比常规表达式操作符更好的工具。
内部和外部的迭代
历史上,Java集合是不能够表达内部迭代的,而只提供了一种外部迭代的方式,也就是for或者while循环。要描述内部迭代,我们需要用到LambdaJ这样的类库:
1
2
|
List persons = asList( new Person( "Joe" ), new Person( "Jim" ), new Person( "John" ));
forEach(persons).setLastName( "Doe" );
|
从上面的例子可以看出,我们不需要关心last name是怎么被设置到每一个person对象里面去的,也许这样的行为是支持并发执行的。现在我们可以在Java 8中使用类似的表达了:
1
|
persons.forEach(p -> p.setLastName( "Doe" ))
|
内部迭代其实和集合的批量操作并没有密切的联系,这只是一个小小的特性,借助它我们感受到语法表达上的变化。真正有意思的和批量操作相关的是新的流(stream)API。
流API
新的java.util.stream包已经添加进JDK了,现在我们可以借助Java 8执行filter/map/reduce风格的操作了。
流API允许我们声明对数据进行串行或者并行的操作:
1
2
3
|
List persons = … // sequential version
Stream stream = persons.stream(); //parallel version
Stream parallelStream = persons.parallelStream(); |
java.util.stream.Stream接口提供了批量数据操作的入口,取得了对流实例的引用,我们就可以对集合执行如下有趣的任务了:
Filter
在数据流中实现过滤功能是首先我们可以想到的最自然的操作了。Stream接口暴露了一个filter方法,它可以接受表示操作的Predicate实现来使用定义了过滤条件的lambda表达式。
1
2
|
List persons = … Stream personsOver18 = persons.stream().filter(p -> p.getAge() > 18 );
|
Map
假使我们现在过滤了一些数据,比如转换对象的时候。Map操作允许我们执行一个Function的实现(Function<T,R>的泛型T,R分别表示执行输入和执行结果),它接受入参并返回。首先,让我们来看看怎样以匿名内部类的方式来描述它:
1
2
3
4
5
6
7
8
|
Stream students = persons.stream() .filter(p -> p.getAge() > 18 )
.map( new Function() {
@Override
public Student apply(Person person) {
return new Student(person);
}
});
|
现在,把上述例子转换成使用lambda表达式的写法:
1
2
3
|
Stream map = persons.stream() .filter(p -> p.getAge() > 18 )
.map(person -> new Student(person));
|
Lambda在把参数传给map方法的时候,实际却并没有使用这个参数,那么我们就可以写成这样:
1
2
3
|
Stream map = persons.stream() .filter(p -> p.getAge() > 18 )
.map(Student:: new );
|
Collect
“流”抽象天生就该是持续的,我们使用流来描述操作,但是如果我们要获取最终结果的话,必须收集流产生的最终结果。Stream API提供了一系列“最终”的方法,collect()方法就是其中的一个,我们借此可以收集操作的最终结果:
1
2
3
4
|
List students = persons.stream() .filter(p -> p.getAge() > 18 )
.map(Student:: new )
.collect( new Collector>() { … });
|
幸运的是,大多数情况下你不需要自己实现Collector接口,而是利用Collectors工具类:
1
2
3
4
|
List students = persons.stream() .filter(p -> p.getAge() > 18 )
.map(Student:: new )
.collect(Collectors.toList());
|
或者,如果我们想使用特定的实现类来收集结果:
1
2
3
4
|
List students = persons.stream() .filter(p -> p.getAge() > 18 )
.map(Student:: new )
.collect(Collectors.toCollection(ArrayList:: new ));
|
并行和串行
一个使用新的Stream API有趣的特性是它从来都不需要所谓串行或者并行的方法,可以从一开始就并行地消费数据,或者在处理流中的任意时刻转为串行的。
1
2
3
4
5
6
|
List students = persons.stream() .parallel()
.filter(p -> p.getAge() > 18 ) // filtering will be performed concurrently
.sequential()
.map(Student:: new )
.collect(Collectors.toCollection(ArrayList:: new ));
|
这里有隐藏的一点是,数据处理的并行部分会自动地自我管理,不需要我们自己来处理并发的问题。
总结
好了,要结束了。新的Stream API和lambda表达式给Java 8带来了很多新的特性。当然,在这篇文章以外还有很多没有谈及到,但愿很快我可以给你带给你更多有趣的特性。
文章系本人原创,转载请保持完整性并注明出自《四火的唠叨》
相关推荐
关于Java8 inAction所有的Demo 非常的实用,全部来自本人亲人编写 放心使用
java8 lambda表达式在集合中的使用,包含代码例子。
Lambda表达式之集合操作,代码里主要针对java 集合list的操作
Stream和Lambda表达式是Java 8引入的两个重要特性,它们极大地简化了集合处理和函数式编程的复杂性。以下是关于Stream和Lambda表达式的最佳实践介绍: Lambda表达式 Lambda表达式允许我们以简洁的方式表示匿名函数...
java 8 新特性lambda表达式使用DEMO,怎么使用stream api 来操作集合,collect , fiter, foreach , map等等方法的使用示范
Java8发布到现在至少3年了,但是对Lambda表达式不熟悉、看不懂、不会用的现象非常常见。 即使是升级到JDK1.8了,但是很多开发者依然是停留在1.8之前的开发方式,使用的也是非常老旧和过时的API,遇到函数式接口也是...
主要介绍了Java8 用Lambda表达式给List集合排序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
《精通lambda表达式:Java多核编程》介绍Java SE 8中与lambda相关的特性是如何帮助Java迎接下一代并行硬件架构的挑战的。本书讲解了如何编写lambda、如何在流与集合处理中使用lambda,并且提供了完整的代码示例。你...
Lambda and Collections,学习Java集合框架(Java Collections Framework)新加入的方法 Streams API(I),Stream API基本用法 Streams API(II),Stream规约操作用法,顺道说明接口静态方法和默认方法以及方法引用的...
Lambda表达式是Java SE 8中包含的一个新的重要功能。它们提供了一种清晰简洁的方式来使用表达式来表示一个方法接口。 Lambda表达式还可以改进收集库(Collection libraries),从而更容易地从集合中遍历,过滤和提取...
本文主要介绍了Lambda表达式和Java集合框架的相关知识,具有很好的参考价值。下面跟着小编一起来看下吧
在这篇教程里,我们将要去了解下即将到来的JDK 8(译注,现在JDK 8已经发布了)中的Lambda表达式——特别是怎样使用它来编写Comparator和对集合(Collection)进行排序。 这篇文章是Baeldung上的“Java ——...
SpringDemo:Java集合,Lambda表达式,Stream API和Spring Lifecycle方法的演示
主要介绍了java使用lambda表达式对List集合进行操作技巧适用jdk1.8,感兴趣的朋友跟着小编一起看看实现代码吧
使用Lambda表达式查找指定字符,(input parameters)=>expression
java8集合源码java8 lambda 流 rxjava 在 Java 8 版本中,Java 提供了对函数式编程、新的 JavaScript 引擎、用于日期时间操作的新 API、新的流 API 等的支持。 新的功能: Lambda 表达式 向 Java 添加函数处理能力。...
Lambda 表达式: 介绍 Java 8 中引入的 Lambda 表达式,以及如何使用 Lambda 表达式来简化代码和实现函数式编程风格。 Stream API: 介绍 Java 8 中引入的 Stream API,以及如何使用 Stream API 来处理集合数据和...
主要介绍了Java Lambda表达式之从集合到流知识,非常不错,具有参考借鉴价值,需要的朋友可以参考下
java8集合源码Lambda 表达式练习 - Koushik 在更新此文件的同时,也同时更新 Java 8 Notes Refer package for lambda exercises: com.unit1practise. - com.unit1practise.java8 : Implementing sample behavior to ...
Lambda2sql(lambda)->“ sql” 将Java 8 lambda转换为SQL语句。 例如,以下谓词: person -> person.getAge() < 100> 200 ... 在jdk.internal.lambda.dumpProxyClasses ,如果lambda表达式未序列