java8中lamba表达式的使用

 更新时间:2017年02月22日 16:50:57   作者:遁地龙卷风  
这篇文章主要介绍了java8中lamba表达式的使用,非常不错,具有参考借鉴价值,需要的朋友可以参考下

(-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表达式的使用,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Java并发编程示例(十):线程组

    Java并发编程示例(十):线程组

    这篇文章主要介绍了Java并发编程示例(十):线程组,Java提供了ThreadGroup类来控制一个线程组,一个线程组可以通过线程对象来创建,也可以由其他线程组来创建,生成一个树形结构的线程,需要的朋友可以参考下
    2014-12-12
  • 使用proguard对maven构建的springboot项目进行混淆方式

    使用proguard对maven构建的springboot项目进行混淆方式

    文章介绍了如何使用ProGuard对Maven构建的Spring Boot项目进行混淆,并解决混淆后可能遇到的版本兼容性问题和类名冲突问题,主要步骤包括下载高版本的ProGuard、配置POM文件、添加ProGuard配置文件、修改Spring Boot启动文件以避免类名冲突
    2024-11-11
  • Java并发工具类Future使用示例

    Java并发工具类Future使用示例

    这篇文章主要介绍了Java并发工具类Future使用示例,本文需要注意future.get()方法是阻塞式的,如果调用该方法的时候任务尚未执行完成,则会一直等待下去,直到任务执行结束,本文通过示例代码给大家介绍的非常详细,需要的朋友参考下吧
    2022-06-06
  • 解答为什么 Java 线程没有Running状态

    解答为什么 Java 线程没有Running状态

    Java 线程没有Running状态指的是一个在 JVM 中执行 的线程处于的状态,本文小编将为大家详解一二,需要的朋友可以参考下面文章具体内容
    2021-09-09
  • java常见的字符串拼接方式总结

    java常见的字符串拼接方式总结

    这篇文章主要为大家详细介绍了java中常见的字符串拼接方式,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-09-09
  • spring security自定义认证登录的全过程记录

    spring security自定义认证登录的全过程记录

    这篇文章主要给大家介绍了关于spring security自定义认证登录的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-12-12
  • RocketMQ消息丢失的场景以及解决方案

    RocketMQ消息丢失的场景以及解决方案

    Apache RocketMQ是企业级的消息中间件,以其高性能和高可靠性而广泛应用,但是,消息丢失的问题在实践中仍然存在,本文将探讨此问题并提供解决方案,需要的朋友可以参考下
    2023-11-11
  • IDEA中Services栏不显示的解决方案小结

    IDEA中Services栏不显示的解决方案小结

    正常编译完一个SpringBoot或者SringCloud项目之后,Services都会显示出你有哪些服务,如果没有services栏怎么解决呢?下面小编给大家分享IDEA中Services栏不显示的解决方案小结,感兴趣的朋友一起看看吧
    2021-08-08
  • spring boot如何使用spring AOP实现拦截器

    spring boot如何使用spring AOP实现拦截器

    本篇文章主要介绍了spring boot如何使用spring AOP实现拦截器,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • Java实现一个简单的线程池代码示例

    Java实现一个简单的线程池代码示例

    线程池是管理线程的一个池子,通过阻塞队列管理任务,主要参数包括corePoolSize、maximumPoolSize、keepAliveTime等,这篇文章主要介绍了Java实现一个简单的线程池的相关资料,需要的朋友可以参考下
    2024-09-09

最新评论