java8中lamba表达式的使用

发布时间 - 2026-01-10 23:13:45    点击率:

(-1)前言

  学习lamba表达式是十分重要的,你会发现java变的可爱多了。

(0)函数式接口

  只有一个方法的接口称为函数式接口

JButton jButton = new JButton("123");
  jButton.addActionListener(new ActionListener() {
  @Override
  public void actionPerformed(ActionEvent e) {}});

等同于

jButton.addActionListener(e->System.out.println("Hello world"));
  jButton.addActionListener((e)->System.out.println("Hello world"));
  jButton.addActionListener((ActionEvent e)->System.out.println("Hello world"));
  jButton.addActionListener((ActionEvent e)->{System.out.println("Hello world");return;});

a.规则

  A->B

  A 部分是传入方法的参数

  B 部分是函数体

  参数类型以及返回类型如果可以通过上下文推断出来可不写

   当参数只有一个而且它的类型可以被推导得知时,该参数列表外面的括号可以被省略

   当函数体只有一个语句且返回类型可被推导时{}可省略

b.例子

Runnable runnable = ()->System.out.println(sign);
  Runnable runnable2 = new Runnable() {
  @Override
  public void run() {
  // TODO Auto-generated method stub}
  };
  通过匿名内部类我们知道run方法是不需要参数的
  System.out.println(sign) 相当于run方法的方法体
  Comparator<Integer> lol = (x,y)->x-y;
  Comparator<Integer> lol = (x,y)->{System.out.println(x+y);return x-y;};
  new Comparator<Integer>() {
  @Override
  public int compare(Integer o1, Integer o2) {
  // TODO Auto-generated method stub
  return 0;
  }
};

通过匿名内部类我们知道compare方法需要两个参数

这时编译通过Comparator<Integer>中Integer推导出参宿类型及返回类型

c.深入

  lamba表达式可被看做函数,java.util.function定义了常用的函数式接口

  http://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html

  BiFunction<T,U,R>

  T 代表第一个参数

  U 代表第二个参数

  R 代表返回值

  这表时T,U,R都需要编译器根据上下文进行类型推导

  Consumer<T>  代表e->System.out.println("Hello world")

  所以当一个方法需要的是lamba表达式时,参数展现形式是java.util.function中定义的样式

(2)方法引用

  方法引用是对Lamba表达式的简化

  类名::方法名(对象方法、类方法)

int[] oop = {3,1,2,1};
  static void sayHello(Integer name)
  {
  System.out.println(123);
  }
  Arrays.stream(oop).forEach(Test::sayHello);
  Arrays.stream(oop).forEach(s->Test.sayHello(s));

  构造方法引用:Class::new

  数组构造方法引用:TypeName[]::new

(3)强制类型转换

  有时候编译器通过上下文推导出的返回类型与实际类型不符时需要进类型转换

Stream<Object> strings = shapelist.stream().<Object>map(s->s.getColor());
  s.getColor())

  s.getColor()返回的是String

(4)lamba表达式在java对象中的应用

你应该在任何java对象中尝试应用lamba表达式,通则是将这个对象转换成java.util.stream,流有串行并行之分哦!并行流关键字parallelStream

数组   Arrays.stream()

List、Set   .stream()  

String  String.chars

...

java.util.stream提供了许多方法用来操作流中的数据,去试一试吧

http://docs.oracle.com/javase/8/docs/api/

java 8英文API,没有找到中文的...

(2)对流整体的操作

比如我们可以求一个流的的总和

int sum = Arrays.stream(oop).sum();
int sum1 = Arrays.stream(oop).reduce(0,(x,y)->x+y);

(3)集合之间的转换

  我们可以将ArrayList<Shape> 转换成ArrayList<String>、Set<String>、HashMap<String,String>,HashMap<String,Shape>甚至是更复杂的

a.map()

  该方法是映射的意思(一开始我联想到了HashMap),还有mapToDouble等

b.collect()

  collect()接受Collectors类型的参数,用来将流重新汇合,

  Collectors是收集器,Collectors.toList(),Collectors.toMap()、Collectors.groupingBy等

c.例子  

public class Shape
  {
  private String color;
  public Shape() {
  // TODO Auto-generated constructor stub
  }
  public String getColor() {
  return color;
  }
  public void setColor(String color) {
  this.color = color;
  }
  public Shape(String color)
  {
  this.color = color;
  }
  }
  ArrayList<String> colorList = new ArrayList<String>(){
  {
  add("Red");
  add("Blue");
  add("Yellow");
  }
  };
  List<Shape> shapeList = colorList.stream().map(Shape::new).collect(Collectors.toList());
  List<String> colos = shpaeList.stream().map(s->s.getColor()).collect(Collectors.toList());
  Set<String> colosSet = shpaeList.stream().map(s->s.getColor()).collect(Collectors.toSet());
  Map<String, String> colorMap = colorList.stream().collect(Collectors.toMap(a->a,s->s));
  Map<String,Shape> shapesMap = shpaeList.stream().collect(Collectors.toMap(s->s.getColor(), s->s));

  Eclipse点不出getColor()方法,还以为用法不对...

  

Map<String,Set<Shape>> shapeMapSet = shpaeList.stream().collect(Collectors.groupingBy(s->s.getColor(),Collectors.toSet()));
  Map<String,Map<String, List<Shape>>> shapeMap3 = shpaeList.stream().collect(Collectors.groupingBy(s->s.getColor(),Collectors.groupingBy(s->s.getColor(),Collectors.toList())));

(4)集合本身的操纵

  想要改变现有集合而不产生新的集合可以使用

 Iterable.forEach(Consumer),Collection.removeAll(Predicate),List.replaceAll(UnaryOperator),List.sort(Comparator)和Map.computeIfAbsent()等
  shpaeList.sort(Comparator.comparing(Shape::getColor));

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


# java8的lambda表达式  # Java8中lambda表达式的应用及一些泛型相关知识  # Java8 Lambda表达式详解及实例  # Java8新特性lambda表达式有什么用(用法实例)  # Java8新特性之Lambda表达式浅析  # 只有一个  # 的是  # 我们可以  # 转换成  # 小编  # 象中  # 第一个  # 不出  # 在此  # 不需要  # 则是  # 而不  # 可以通过  # 第二个  # 英文  # 给大家  # 你应该  # 可以使用  # 没有找到  # 之分 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  历史网站制作软件,华为如何找回被删除的网站?  Laravel storage目录权限问题_Laravel文件写入权限设置  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  公司门户网站制作流程,华为官网怎么做?  Laravel如何发送系统通知?(Notification渠道示例)  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  网站图片在线制作软件,怎么在图片上做链接?  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  Laravel如何与Pusher实现实时通信?(WebSocket示例)  如何在腾讯云服务器上快速搭建个人网站?  如何在万网自助建站平台快速创建网站?  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  Laravel如何实现模型的全局作用域?(Global Scope示例)  使用豆包 AI 辅助进行简单网页 HTML 结构设计  Laravel如何创建自定义Facades?(详细步骤)  黑客如何利用漏洞与弱口令入侵网站服务器?  nginx修改上传文件大小限制的方法  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  如何用西部建站助手快速创建专业网站?  jQuery validate插件功能与用法详解  js实现点击每个li节点,都弹出其文本值及修改  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  如何快速生成可下载的建站源码工具?  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  如何批量查询域名的建站时间记录?  网站制作企业,网站的banner和导航栏是指什么?  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  如何用PHP工具快速搭建高效网站?  Laravel怎么连接多个数据库_Laravel多数据库连接配置  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  如何在万网开始建站?分步指南解析  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  ,交易猫的商品怎么发布到网站上去?  JavaScript如何实现音频处理_Web Audio API如何工作?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  清除minerd进程的简单方法  网站制作报价单模板图片,小松挖机官方网站报价?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?