上期我们分析了Java8中Interface的相关新特性,其中包括函数式接口,可以在调用时,使用一个Lambda表达式作为参数,那么我们就来谈谈Java8中的Lambda表达式吧。

定义

Lambda表达式基于函数式接口实现,故可以认为Lambda表达式是对函数式接口的匿名内部类的一种简写形式。

格式

Lambda表达式的具体形式为:()->{}

箭头表达式->将Lambda表达式分为了左右两部分,左侧为参数列表,右侧为具体实现,即Lambda体。

具体有以下以及情形:

1. 无参数无返回值

Runnable runnable = () -> {System.out.println("run");
};
复制代码

2. 有一个参数无返回值

public interface MyInterface {void test(int x);
}MyInterface i = (x) -> System.out.println(x);
复制代码

3. 只要一个参数,小括号可以不写

MyInterface i = x -> System.out.println(x);
复制代码

4. 有多个参数有返回值,并且Lambda体有多条语句

Comparator<Integer> comparator = (x, y) -> {System.out.println("Comparator");return Integer.compare(x, y);
};
复制代码

5. Lambda体中只有一条语句,return和{}可以省略

Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);
复制代码

6. Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断”

Comparator<Integer> comparator = (Integer x, Intergery) -> Integer.compare(x, y);
Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);
复制代码

总结:

  • 参数类型可忽略,若写所有参数都要写,若不写,可以类型推断
  • 参数有且仅有一个时,()可以省略
  • Lambda体只有一条语句,return{}都可忽略

Java8内置四大核心函数式接口(java.util.function.*包)

  • Consumer 消费型接口
public static void main(String[] args) {String str = "str";consumer(str, s -> System.out.println(s));
}public static void consumer(String str, Consumer<String> function) {function.accept(str);
}
复制代码
  • Supplier 供给型接口
public static void main(String[] args) {supplier(() -> "str");
}public static String supplier(Supplier<String> function) {return function.get();
}
复制代码
  • Function<T, R> 函数型接口
public static void main(String[] args) {String str = "str";function(str, s -> s);
}public static String function(String str, Function<String, String> function) {return function.apply(str);
}
复制代码
  • Predicate 断定型接口
public static void main(String[] args) {String str = "str";predicate(str, s -> s.isEmpty());
}public static boolean predicate(String str, Predicate<String> function) {return function.test(str);
}
复制代码

Lambda表达式就到这里了,一开始用起来会不习惯,用多了上手起来就熟练了,而且越用越信手拈来。

下期我们将分析用引用方式简写Lambda表达式,敬请期待。

微信公众号:码上论剑 请关注我的个人技术微信公众号,订阅更多内容

Java8新特性系列(Lambda)相关推荐

  1. 【java8新特性】——lambda表达式与函数式接口详解(一)

    一.简介 java8于2014年发布,相比于java7,java8新增了非常多的特性,如lambda表达式.函数式接口.方法引用.默认方法.新工具(编译工具).Stream API.Date Time ...

  2. java8新特性之lambda表达式--超级详细版本

    java8新特性之lambda表达式 1.什么是lambda表达式?为什么用它? 2. 为什么Java需要lambda表达式? 3. lambda表达式的语法 4.函数式接口 4.1 什么是函数式接口 ...

  3. Java8 新特性:Lambda 表达式、方法和构造器引用、Stream API、新时间与日期API、注解

    Java8新特性:Lambda 表达式.方法和构造器引用.Stream API.新时间与日期API.注解 1.Java8新特性 1.1.主要的新特性: 1.2.编程风格 2.Lambda 表达式 2. ...

  4. java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合

    java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合 比如,我有一张表: entity Category.java service CategoryServic ...

  5. java8新特性总结——lambda表达式

    最近看尚硅谷java8新特性视屏,总结一下学习知识. Lambda表达式:是一个匿名函数,我们可以把Lambda理解为一段可以传递的代码(将代码像数据一样传递),可以写出更简洁更灵活的代码.作为一种更 ...

  6. 零基础学习java------21---------动态代理,java8新特性(lambda, stream,DateApi)

    1. 动态代理 在一个方法前后加内容,最简单直观的方法就是直接在代码上加内容(如数据库中的事务),但这样写不够灵活,并且代码可维护性差,所以就需要引入动态代理 1.1 静态代理实现 在讲动态代理之前, ...

  7. java8新特性之Lambda流常用表达式的方法合集

    我们日常工作中,对于数据遍历.分组以及转换需要大量代码实现,借助java8新特性-LambdaLambda 流操作,几行代码可以帮助我们实现复杂代码,这里把 Lambda 流的常用方法用案列讲解一下. ...

  8. Java8新特性之Lambda,呦呦呦

    Java8新特征之Lambda Lambda表达式(也称为闭包),它允许我们将函数当成参数传递给某个方法,或者把代码本身当作数据处理.很多语言(Groovy.Scala等)从设计之初就支持Lambda ...

  9. 夯实Java基础(二十二)——Java8新特性之Lambda表达式

    1.前言 Java 8于14年发布到现在已经有5年时间了,经过时间的磨练,毫无疑问,Java 8是继Java 5(发布于2004年)之后的又一个非常最重要的版本.因为Java 8里面出现了非常多新的特 ...

最新文章

  1. XML学习总结(2)——XML简单介绍
  2. 4测试命令_科普 | 最全的Filecoin测试网挖矿步骤解析
  3. 用 Go 构建一个区块链 -- Part 4: 交易(1)
  4. 高并发服务遇 redis 瓶颈引发的事故
  5. *【牛客 - 301哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级)】小乐乐打游戏(bfs,双元bfs,思维)
  6. 关于mysql修改密码后的问题
  7. 用AsyncTask来获取网络图片
  8. 再谈.NET Micro Framework移植
  9. js实现审批流_小程序瀑布流组件:支持翻页与图片懒加载
  10. java并发:初探用户线程和守护线程
  11. Tiktok引流到独立站?
  12. 转载:matlab流场可视化后处理
  13. ZEMAX | 绘图分辨率结果对光线追迹的影响
  14. 计算机网络网线制作教案,制作网线教案.doc
  15. 555低电平出发定时器
  16. ap位置服务器怎么找,如何正确选择无线AP的安装位置?
  17. 如何从零开始写一个操作系统?
  18. Java基础 | 多态
  19. 【ICLR 2023】Diffusion Models扩散模型和Prompt Learning提示学习:prompt-to-prompt
  20. DrEA-many objective总结

热门文章

  1. Mysql学习之order by的工作原理
  2. http协议基础(七)通用首部字段
  3. spring-boot启动源码学习-1
  4. 深入浅出 消息队列 ActiveMQ(转)
  5. MYSQL备份与恢复精华篇
  6. Unity 编辑器扩展 场景视图内控制对象
  7. 高效学习Oracle的方法论
  8. acmug 2016 mysql年会_2017年第2次MariaDB开发者大会(深圳,中国)相关安排
  9. django获取div id_Django+React全栈开发:路由
  10. XDP/eBPF — Overview