Lambda是Java8的主要特色,Java 8: Lambdas & Java Collections | zeroturnaround.com一文介绍了使用Lambda集合处理大量数据的方法。

首先Java集合引入了内部遍历,原来 LambdaJ下面这种方法也可以在Java8中实现:

List<Person> persons = asList(new Person("Joe"), new Person("Jim"), new Person("John"));
forEach(persons).setLastName("Doe");

Java8类似这种遍历方式如下:
persons.forEach(p -> p.setLastName("Doe"))

Java8 JDK主要引入了一个新的API: Stream API来处理大数据,可以用集合执行filter/map/reduce-之类的操作。

使用Stream APIk可以对一个数据流实现顺序或并行操作。

ist<Person> persons = … 

// sequential version
Stream<Person> stream = persons.stream(); //parallel version
Stream<Person> parallelStream = persons.parallelStream();

java.util.stream.Stream提供了一种操作大量数据接口,当得到一个stream实例后,能够实现下面有趣的集合操作:

1.Filter

过滤操作是首先很自然的一个操作(类似SQL where查询语句)

List<Person> persons = …
Stream<Person> personsOver18 = persons.stream().filter(p -> p.getAge() > 18);

(banq注:有了这样强大过滤功能,以后过滤查询别老是惦记着用SQL语句了,负载都集中到数据库上了,如果数据量再大就用hadoop/hive)。

2. MAP
当我们有了过滤好的数据,我们能够实现业务操作,比如对象迁移。如果使用内部类是如下代码:

Stream<Student> students = persons.stream()
.filter(p -> p.getAge() > 18)
.map(new Function<Person, Student>() {
@Override
public Student apply(Person person) {
return new Student(person);
}
});

但是使用lambda语法很简单:

Stream<Student> map = persons.stream()
.filter(p -> p.getAge() > 18)
.map(person -> new Student(person));

因为mao方法参数是一种函数参数consumer,因此我们还可以传入方法如下:

Stream<Student> map = persons.stream()
.filter(p -> p.getAge() > 18)
.map(Adult::new);

前面我们已经实现对数据流的操作,最后我们需要收集总结这些数据结果,collect() 让我们实现这点:

List<Student> students = persons.stream()
.filter(p -> p.getAge() > 18)
.map(Adult::new)
.collect(new Collector<Student, List<Student>>() { … });

上面实现了自己的Collector接口,大部分情况下可能不需要:

List<Student> students = persons.stream()
.filter(p -> p.getAge() > 18)
.map(Student::new)
.collect(Collectors.toList());

也可以指定集合具体类型:

List<Student> students = persons.stream()
.filter(p -> p.getAge() > 18)
.map(Student::new)
.collect(Collectors.toCollection(ArrayList::new));

有关顺序和并行操作:
Stream API并不需要显式声明顺序或并行,在进行consumer时是并行,然后切换到顺序:

List<Student> students = persons.stream()
.parallel()
.filter(p -> p.getAge() > 18) // filtering will be performed concurrently
.sequential()
.map(Student::new)
.collect(Collectors.toCollection(ArrayList::new));

filter函数默认是并行操作。

Java 8: Lambdas和新的集合Stream API的更多相关文章

  1. Java8 新特性 Lambda & Stream API

    目录 Lambda & Stream API 1 Lambda表达式 1.1 为什么要使用lambda表达式 1.2 Lambda表达式语法 1.3 函数式接口 1.3.1 什么是函数式接口? ...

  2. JAVA 8 主要新特性 ----------------(六)集合Stream API

    一.简介Stream Java8中有两大最为重要的改变.第一个是 Lambda 表达式:另外一 个则是 Stream API(java.util.stream.*).Stream 是 Java8 中处 ...

  3. 夯实Java基础(二十三)——Java8新特征之Stream API

    1.Stream简介 Java8中除了引入了好用的Lambda表达式.Date API之外,另外还有一大亮点就是Stream API了,也是最值得所有Java开发人员学习的一个知识点,因为它的功能非常 ...

  4. java 新特性之 Stream API

    强大的 Stream API 一.Stream API 的概述 Stream到底是什么呢? 是数据渠道,用于操作数据源(集合.数组等)所生成的元素序列. "集合讲的是数据,Stream讲的是 ...

  5. Java8 新特性之Stream API

    1. Stream 概述 Stream 是Java8中处理集合的关键抽象概念,可以对集合执行非常复杂的查找,过滤和映射数据等操作; 使用 Stream API 对集合数据进行操作,就类似于使用 SQL ...

  6. 谈谈集合.Stream Api

    1. 什么是stream API Java8提供的stream API可以让程序员像操作数据库一样操作集合.Stream API可以极大提高Java程序员的生产力,让程序员写出高效率.干净.简洁的代码 ...

  7. 【Java8新特性】Stream API有哪些中间操作?看完你也可以吊打面试官!!

    写在前面 在上一篇<[Java8新特性]面试官问我:Java8中创建Stream流有哪几种方式?>中,一名读者去面试被面试官暴虐!归根结底,那哥儿们还是对Java8的新特性不是很了解呀!那 ...

  8. JDK1.8新特性——Stream API

    JDK1.8新特性——Stream API 摘要:本文主要学习了JDK1.8的新特性中有关Stream API的使用. 部分内容来自以下博客: https://blog.csdn.net/icarus ...

  9. 【Java8新特性】面试官:谈谈Java8中的Stream API有哪些终止操作?

    写在前面 如果你出去面试,面试官问了你关于Java8 Stream API的一些问题,比如:Java8中创建Stream流有哪几种方式?(可以参见:<[Java8新特性]面试官问我:Java8中 ...

随机推荐

  1. vbox磁盘空间扩容

    前提:将虚拟机真正关机,不能在仅状态保存的场合做磁盘扩容. 步骤1.获取需要增加容量的映像的uuid 在vbox的安装目录下使用命令行:VBoxManage list hdds 得到结果如下: UUI ...

  2. makefile、gdb使用记录

    makefile的模板 all: rover server station rover: rover.c tcputil.o gcc rover.c tcputil.o -o rover -lpthr ...

  3. 时间都去哪了?——安卓GTD工具

    GTD是英文Getting Things Done的缩写,是一种行为管理的方法,也是David Allen写的一本书的书名. GTD的主要原则在于一个人需要通过记录的方式把头脑中的各种任务移出来.通过 ...

  4. homework09-虐心的现程设终于要告一段落了

    V3.0版本今天凌晨出炉 添加了随机生成 添加了文件打开 完全按照老师的要求搞定了 V2.0版本更新 添加了中间数组变量显示 这次作业写了整整一天,把以前能用的代码都改了一个遍 最后变成了网页版的小程 ...

  5. JavaIO流(02)RandomAccessFile类详解

    RandomAccessFile类 该类主要是对文件内容进行操作,可以随机的读取一个文件中指定位置的数据: 但是如果想实现这样的功能,则每个数据的长度应该保持一致:   构造方法:   接受File类 ...

  6. Objective-C: NSFileManager 的使用

    在Objective-C 中的 Foundation 框架中,文件操作是由NSFileManager 类来实现的. 下面通过例子来说明如何创建一个文件,并向文件中写内容,以及如何读出文件中的内容: - ...

  7. maven for eclipse在线安装

    在线安装 地址变了下面的: http://download.eclipse.org/technology/m2e/releases      Eclipse Indigo安装Maven插件Maven ...

  8. 【转】Watir, Selenium & WebDriver

    转自:http://watirmelon.com/2010/04/10/watir-selenium-webdriver/ Please also see my new ‘Watir-WebDrive ...

  9. 加粗合并latex表格线的加粗及合并两行

    每日一贴,今天的内容关键字为加粗合并 在latex中要设置加粗的表格线,要使用如下包: \usepackage{booktabs} 如下图中的表格,首行(\toprule[2pt]),旁边行(\mid ...

  10. 关于STM32的ST官方的库的一点看法

    标题确实很别扭,因为我现在用这个库也很别扭. 在不久之前,一直有个讨论的话题:STM32开发是用库还是用寄存器? 很多人的结论是不需要讨论! 但是,今天我想说下我的看法. 首先,我还是一个菜鸟,对库对 ...