zoukankan      html  css  js  c++  java
  • Java 8: Lambdas和新的集合Stream API

    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函数默认是并行操作。

  • 相关阅读:
    vue 前端框架 (二) 表格增加搜索
    vue 前端框架
    数据结构-树的基本操作
    linux的串口驱动分析
    TTY驱动程序架构
    linux MTD系统解析(转)
    DM9000网卡的基本工作原理
    ok6410的LCD裸机范例
    ok6410的DMA裸机总结
    ok6410串口裸机总结
  • 原文地址:https://www.cnblogs.com/feika/p/4464209.html
Copyright © 2011-2022 走看看