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

  • 相关阅读:
    Linux内核RPC请求过程
    二分图
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 文本加密
    Java实现 蓝桥杯 算法提高 文本加密
    Java蓝桥杯 算法提高 九宫格
    Java蓝桥杯 算法提高 九宫格
  • 原文地址:https://www.cnblogs.com/feika/p/4464209.html
Copyright © 2011-2022 走看看