Lambda表达式和SteamAPI是JDK8的新特性,所有在实验下面代码时候,请升级JDK到8版本,否则会编译 报错。

首先看Lambda表达式,同正则表达式类似,Lambda表达式不能在JAVA代码中直接使用,先得做一下封装。

import java.util.ArrayList;

public class LabExamp {
    /**
     *  Lambda表达式(λ表达式)可见有三部分组成:参数列表,箭头(->),以及一个表达式或语句块。
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //Runnable r1=(x,y)->{return x+y;};
        ArrayList<Student> list=new ArrayList<Student>();
        Student std1=new Student();
        std1.setId(1);
        std1.setName("小王");
        list.add(std1);
        Student std2=new Student();
        std2.setId(2);
        std2.setName("小张");
        list.add(std2);
        
    //    list.forEach(o -> {System.out.println(o);});
    //    list.forEach(o -> ((Student) o).getName()); //如果省略ArrayList的类型声明,则必须这么写强制转型
        list.forEach(stu -> {System.out.println( stu.getName());});
        
        
        for(Student o: list) { // 外部迭代
                System.out.println(o.getName());
        }
        
        
    }
    
}

---------------------------------------------------------------------------

public class Student {
    private  Integer id;
    private  String name;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

上面例子中可以看出,Lambda表达式跟for循环的代码效果是一样的,但是用Lambda表达式更加简洁。

接着是SteamAPI,

Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用 fork/join 并行方式来拆分任务和加速处理过程。

import java.util.ArrayList;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class SteamExamp {
/*
 *
 * Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。
 * 同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,
 * 使用 fork/join 并行方式来拆分任务和加速处理过程。通常编写并行代码很难而且容易出错,
 * 但使用 Stream API 无需编写一行多线程的代码,就可以很方便地写出高性能的并发程序。
 */
    public static void main(String[] args) {
        ArrayList<Student> list=new ArrayList<Student>();
        Student std1=new Student();
        std1.setId(1);
        std1.setName("小王");
        list.add(std1);
        Student std2=new Student();
        std2.setId(2);
        std2.setName("小张");
        list.add(std2);
        Student std6=new Student();
        std6.setId(6);
        std6.setName("小刘");
        list.add(std6);    
        Student std3=new Student();
        std3.setId(3);
        std3.setName("小李子");
        list.add(std3);

//        ArrayList<Student> transactionsIds = list.parallelStream().
//                 filter(t -> t.getType() == Transaction.GROCERY).
//                 sorted(comparing(Transaction::getValue).reversed()).
//                 map(Transaction::getId).
//                 collect(toList());
        ArrayList<Integer> transactionsIds = (ArrayList<Integer>) list.parallelStream().
                 sorted((p1, p2) ->  p1.getId().compareTo(p2.getId())).
                 map(Student::getId).
                 collect(Collectors.toList());    
        ArrayList<Integer> transactionsIds2 = (ArrayList<Integer>) list.parallelStream().
                 sorted((p1, p2) ->  p2.getId().compareTo(p1.getId())).
                 map(Student::getId).
                 collect(Collectors.toList());
        System.out.println(transactionsIds);
        System.out.println(transactionsIds2);
        
        //流的数据源不一定是一个已存在的集合对象,也可能是个“生成器函数”。一个生成器函数会产生一系列元素,供给一个流。
        //Stream.generate(Supplier<T> s)就是一个生成器函数。其中参数Supplier是一个函数接口,里面有唯一的抽象方法 <T> get()。
        Stream.generate(Math::random).limit(5).forEach(System.out::println);
    }

}

----------------------------------------------------

上例输出结果可能是:

[1, 2, 3, 6]
[6, 3, 2, 1]
0.10556146349285433
0.08263394346689457
0.13330880751987728
0.05459269439895098
0.055821882208000884

=======================================================

上面程序的例子就是使用了SteamAPI实现了ArrayList正序和逆序的排列。最后一段是如何产生应该5个元素的随机数列。简单说,对 Stream 的使用就是实现一个 filter-map-reduce 过程,产生一个最终结果,或者导致一个副作用(side effect)。Java8引入Steam概念的目标是配合“集合类批处理操作”的内部迭代和并行处理。

Lambda表达式和SteamAPI相关推荐

  1. Lambda 表达式基础理论与示例

    Lambda 表达式基础理论与示例 Lambda 表达式,也可称为闭包,推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). 使用 Lam ...

  2. lambda表达式树

    一.定义: 表达式树又称为表达式目录树,以数据形式表示语言级代码.所有的数据都存储在树结构中,每个结点表示一个表达式(Expression). 二.要点: –Lambda表达式的参数类型可以忽略,因为 ...

  3. java 8 lambda reduce_JDK8新特性Lambda表达式体验

    "Lambda 表达式"(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstra ...

  4. java saf_Java 8 Lambda表达式探险

    为什么? 我们为什么需要Lambda表达式 主要有三个原因: > 更加紧凑的代码 比如Java中现有的匿名内部类以及监听器(listeners)和事件处理器(handlers)都显得很冗长 &g ...

  5. lamda表达式python_Python--13 lambda表达式

    python 允许使用lambda表达式来创建匿名函数 lambda表达式 >>>def ds(x): ... return 2 * x +1 ... >>> ds ...

  6. C++11:Lambda表达式(匿名函数)理解

    C++在C11标准中引入了匿名函数,即没有名字的临时函数,又称之为lambda表达式.lambda表达式 实质上是创建一个匿名函数/对象.即你可以理解为(Lambda 表达式实际上是一个函数,只是它没 ...

  7. java8 lambda 表达式详解

    lambada 表达式实质上是一个匿名方法,但该方法并非独立执行,而是用于实现由函数式接口定义的唯一抽象方法 使用 lambda 表达式时,会创建实现了函数式接口的一个匿名类实例 可以将 lambda ...

  8. Java8中Lambda表达式的10个例子

    Java8中Lambda表达式的10个例子  例1 用Lambda表达式实现Runnable接口 Java代码   //Before Java 8: new Thread(new Runnable() ...

  9. 【读书笔记】Lambda表达式

    Lambda表达式,是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型. Lambda表达式, 都是用"=>"运算符. 读作"goes t ...

最新文章

  1. Python相关机器学习‘武器库’
  2. 系统异常捕捉处理设计文档
  3. strncmp函数——比较特定长度的字符串
  4. 在RHEL5.4上做YUM
  5. IDEA 创建 SpringCloud项目-多项目方式
  6. 百度云2019落地第一枪打响:两款智能边缘硬件,让城市环卫、农药喷洒都AI起来...
  7. smtplib,发送邮件时的bug
  8. mqttfx连接emq_云服务器上MQTT:EMQ服务搭建使用教程
  9. mysql常见函数的实列
  10. jqGrid添加详细按钮,单击弹出窗体
  11. 大学python教材课后答案_大学慕课2020年Python编程基础课后答案
  12. 前后端分离php还有优势,前后端分离优缺点
  13. 如何在你朋友面前伪装黑客7(程序代码)
  14. bzGhost打造跨平台即时聊天软件之专栏介绍
  15. Mac—Homebrew安装与使用
  16. FM(Factorization Machine)因式分解机 与 TensorFlow实现 详解
  17. uniapp 电子印章_初探uni-app框架 踩坑
  18. Navicat12 过期了怎么办
  19. 人工智能有多吃香?人工智能岗位薪资水平曝光(附赠37G学习资料大礼包)
  20. IPM 鸟瞰图公式转换与推导

热门文章

  1. 自己的英文名字怎么写
  2. 固体理论格林函数介绍
  3. Erlang NIF简析
  4. 窥镜下的OLTP以及我们的发现(一)
  5. 原神抽卡模拟简单代码(概率还原)
  6. 传输原理及网管培训教材
  7. Android中,运用打气筒实现比较复杂的ListView案例
  8. 曝腾讯天美程序员税后250万,月均20万
  9. java跟微服务什么关系_分布式和微服务是什么关系?
  10. 基于无人机的无线电点对点验证解决方案——无需危险爬塔,高效快捷