全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Java8之lambda表达式基本语法

lambda表达式,即带有参数的表达式,为更清晰地理解lambda表达式,先看如下例子:

(1)

class Student{
  private String name;
  private Double score;
  public Student(String name, Double score) {
    this.name = name;
    this.score = score;
  }
  public String getName() {
    return name;
  }
  public Double getScore() {
    return score;
  }
  public void setName(String name) {
    this.name = name;
  }
  public void setScore(Double score) {
    this.score = score;
  }
  @Override
  public String toString() {
    return "{"
        + "\"name\":\"" + name + "\""
        + ", \"score\":\"" + score + "\""
        + "}";
  }
}
@Test
public void test1(){
  List<Student> studentList = new ArrayList<Student>(){
    {
      add(new Student("stu1",100.0));
      add(new Student("stu2",97.0));
      add(new Student("stu3",96.0));
      add(new Student("stu4",95.0));
    }
  };
  Collections.sort(studentList, new Comparator<Student>() {
    @Override
    public int compare(Student o1, Student o2) {
      return Double.compare(o1.getScore(),o2.getScore());
    }
  });
  System.out.println(studentList);
}

(1)中代码调用Collections.sort方法对集合进行排序,其中第二个参数是一个类,准确地说是一个匿名内部类,sort方法调用内部类中的compare方法对list进行位置交换,因为java中的参数类型只能是类或者基本数据类型,所以虽然传入的是一个Comparator类,但是实际上需要传递的仅仅是compare方法,lambda表达式专门针对只有一个方法的接口(即函数式接口),Comparator就是一个函数式接口 

@FunctionalInterface
public interface Comparator<T> {
  int compare(T o1, T o2);
}

@FunctionalInterface的作用就是标识一个接口为函数式接口,此时Comparator里只能有一个抽象方法。

使用lambda表达式之后(1)中的代码改造如下

(2)

public void test1_(){
    List<Student> studentList = new ArrayList<Student>(){
      {
        add(new Student("stu1",100.0));
        add(new Student("stu2",97.0));
        add(new Student("stu3",96.0));
        add(new Student("stu4",95.0));
      }
    };
    Collections.sort(studentList,(s1,s2)-> Double.compare(s1.getScore(),s2.getScore()));
    System.out.println(studentList);
  }

对于有多个参数的情况,语法:

     1. ambda表达式的基本格式为(x1,x2)->{表达式...};

     2. 在上式中,lambda表达式带有两个参数,因此两边的括号不能省略,而参数类型可以省略

     3. 如果表达式只有一行,那么表达式两边的花括号可以省略

另外一个常见的例子是新建一个线程,不使用lambda表达式的写法为

(3)

public void testThread(){
    new Thread(new Runnable() {
      @Override
      public void run() {
        System.out.println("hello, i am thread!");
      }
    }).start();
  }

其中Runnable接口也是一个函数式接口,源码如下

@FunctionalInterface
public interface Runnable {
  /**
   * When an object implementing interface <code>Runnable</code> is used
   * to create a thread, starting the thread causes the object's
   * <code>run</code> method to be called in that separately executing
   * thread.
   * <p>
   * The general contract of the method <code>run</code> is that it may
   * take any action whatsoever.
   *
   * @see   java.lang.Thread#run()
   */
  public abstract void run();
}

将其转换为lambda表达式的写法为

(4)

public void testThread_(){
  new Thread(()-> System.out.println("hello, i am thread!")).start();
}

对于没有参数的情况 ,语法:

     1.参数的括号不能省略,如果只有一句的表达式则可省略花括号和语句结尾的分号

我们构造一个只有一个参数的函数式接口

@FunctionalInterface
public interface MyFunctionalInterface {
  public void single(String msg);
}
/**
 * 需要单个参数
 */
public static void testOnePar(MyFunctionalInterface myFunctionalInterface){
  myFunctionalInterface.single("msg");
}
/**
   * 一个参数,可以省略参数的括号
   */
  @Test
  public void testOneParameter(){
    testOnePar(x-> System.out.println(x));
  }

对于只有一个参数的情况 ,语法:

     1.参数的括号可以省略

在这里我们为了演示只有一个参数的情况自己创建了一个函数式接口,其实java8中已经为我们提供了很多常见的函数式接口

常见的有

Function:提供任意一种类型的参数,返回另外一个任意类型返回值。 R apply(T t);

Consumer:提供任意一种类型的参数,返回空值。 void accept(T t);

Supplier:参数为空,得到任意一种类型的返回值。T get();

Predicate:提供任意一种类型的参数,返回boolean返回值。boolean test(T t);

因此针对上面的情况,我们可以直接使用Consumer类,

/**
   * 需要单个参数
   */
  public static void testOnePar1(Consumer unaryOperator){
    unaryOperator.accept("msg");
  }

总结

以上所述是小编给大家介绍的使用Java8之lambda表达式基本语法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# java8  # lambda表达式  # Java基本语法之内部类示例详解  # 深入理解Java8新特性之Lambda表达式的基本语法和自定义函数式接口  # Java基本语法笔记(菜鸟必看篇)  # Kotlin 与 Java基本语法对比  # Java面试题之基本语法(图解)  # Java入门基础之Java的基本语法与Java所支持的数据类型  # Java基本语法小白入门级  # 只有一个  # 是一个  # 返回值  # 一个函数  # 另外一个  # 小编  # 的是  # 在这里  # 地说  # 一句  # 多个  # 在此  # 将其  # 我们可以  # 第二个  # 给大家  # 仅仅是  # 的花  # 则可  # 在上 


相关文章: html制作网站的步骤有哪些,iapp如何添加网页?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  招商网站制作流程,网站招商广告语?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  香港服务器部署网站为何提示未备案?  详解jQuery停止动画——stop()方法的使用  名字制作网站免费,所有小说网站的名字?  如何快速查询网址的建站时间与历史轨迹?  5种Android数据存储方式汇总  建站之星如何一键生成手机站?  Java解压缩zip - 解压缩多个文件或文件夹实例  武清网站制作公司,天津武清个人营业执照注销查询系统网站?  建站之星CMS建站配置指南:模板选择与SEO优化技巧  如何通过FTP空间快速搭建安全高效网站?  如何用VPS主机快速搭建个人网站?  如何通过商城自助建站源码实现零基础高效建站?  专业网站建设制作报价,网页设计制作要考什么证?  如何通过虚拟主机快速搭建个人网站?  制作网站外包平台,自动化接单网站有哪些?  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  建站主机核心功能解析:服务器选择与网站搭建流程指南  黑客如何通过漏洞一步步攻陷网站服务器?  较简单的网站制作软件有哪些,手机版网页制作用什么软件?  网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?  建站之星导航菜单设置与功能模块配置全攻略  香港服务器租用每月最低只需15元?  独立制作一个网站多少钱,建立网站需要花多少钱?  官网自助建站平台指南:在线制作、快速建站与模板选择全解析  教学论文网站制作软件有哪些,写论文用什么软件 ?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  寿县云建站:智能SEO优化与多行业模板快速上线指南  建站主机无法访问?如何排查域名与服务器问题  如何选择域名并搭建高效网站?  c# await 一个已经完成的Task会发生什么  昆明网站制作哪家好,昆明公租房申请网上登录入口?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  内部网站制作流程,如何建立公司内部网站?  外汇网站制作流程,如何在工商银行网站上做外汇买卖?  Android自定义listview布局实现上拉加载下拉刷新功能  如何快速搭建支持数据库操作的智能建站平台?  长沙企业网站制作哪家好,长沙水业集团官方网站?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  网站专业制作公司有哪些,做一个公司网站要多少钱?  微信推文制作网站有哪些,怎么做微信推文,急?  网站制作员失业,怎样查看自己网站的注册者?  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  建站168自助建站系统:快速模板定制与SEO优化指南  C++用Dijkstra(迪杰斯特拉)算法求最短路径  移民网站制作流程,怎么看加拿大移民官网? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。