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. Codeforces Round #372 (Div. 1) B. Complete The Graph (枚举+最短路)

    题目就是给你一个图,图中部分边没有赋权值,要求你把无权的边赋值,使得s->t的最短路为l. 卡了几周的题了,最后还是经群主大大指点……做出来的…… 思路就是跑最短路,然后改权值为最短路和L的差值 ...

  2. 第二百四十二天 how can I 坚持

    今天... 貌似没啥啊. 第一天带帽子上班. 还有回来买了两个柚子吃了,有点上火啊. 还有今天雾霾爆表啊,pm2.5  600多啊. 还有看了部电影<蚁人>,挺好看.希望不会出二.三.四. ...

  3. 修复Debian(Ubuntu)Grub2 引导

    重装win7, 之前的系统debian 的引导就没有了. 而debian 的盘似乎没有ubuntu的livecd模式,于是用ultraISO将ubuntu的ios文件写入到u盘中. boot时选择启动 ...

  4. (转载)JDOM/XPATH编程指南

    JDOM/XPATH编程指南 本文分别介绍了 JDOM 和 XPATH,以及结合两者进行 XML 编程带来的好处. 前言 XML是一种优秀的数据打包和数据交换的形式,在当今XML大行于天下,如果没有听 ...

  5. HDU 5724 Chess (sg函数)

    Chess 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5724 Description Alice and Bob are playing a s ...

  6. ZOJ 3911 Prime Query(线段树)

    Prime Query Time Limit: 1 Second      Memory Limit: 196608 KB You are given a simple task. Given a s ...

  7. 总结:常用的Linux系统监控命令

    记录一下自己常用的linux系统命令,方便以后查阅,发觉记忆越来越不行了 找到最耗CPU的java线程 ps命令 命令: ps -mp pid -o THREAD,tid,time 或者 ps -Lf ...

  8. ext4.0绘制chart(柱状图,条形图)

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...

  9. HDU 1394 Minimum Inversion Number (树状数组求逆序对)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题目让你求一个数组,这个数组可以不断把最前面的元素移到最后,让你求其中某个数组中的逆序对最小是多 ...

  10. cookie 编码问题

    问题描述:  Control character in cookie value or attribute. 解决方案: 1.前台编码 encodeURIComponent(str) 2.后台解码 原 ...