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

(0)

相关推荐

  • Java8中lambda表达式的应用及一些泛型相关知识

    语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利 顺带用到一些泛型编程,一切都是为了简化代码 场景: 一个数据类,用于记录职工信息 public class Employee { public String name; public int age; public char sex; public String time; public int salary; } 我们有一列此类数据 List<Employee> data = Arrays.asL

  • Java8新特性之Lambda表达式浅析

    说到java 8,首先会想到lambda(闭包)以及虚拟扩展方法(default method),这个特性早已经被各大技术网站炒得沸沸扬扬了,也是我们java 8系列开篇要讲的第一特性(JEP126 http://openjdk.java.net/jeps/126),jdk8的一些库已经应用了lambda表达式重新设计了,理解他对学习java 8新特性有着重要的意义. 一.函数式接口 函数式接口(functional interface 也叫功能性接口,其实是同一个东西).简单来说,函数式接口是

  • Java8新特性lambda表达式有什么用(用法实例)

    我们期待了很久lambda为java带来闭包的概念,但是如果我们不在集合中使用它的话,就损失了很大价值.现有接口迁移成为lambda风格的问题已经通过default methods解决了,在这篇文章将深入解析Java集合里面的批量数据操作(bulk operation),解开lambda最强作用的神秘面纱. 1.关于JSR335 JSR是Java Specification Requests的缩写,意思是Java 规范请求,Java 8 版本的主要改进是 Lambda 项目(JSR 335),其

  • Java8 Lambda表达式详解及实例

    第一个Lambda表达式 在Lambda出现之前,如果我们需要写一个多线程可能需要下面这种方式: Runnable runnable = new Runnable() { @Override public void run() { System.out.println("Hello runnable"); } }; ... thread.start(); 上面的例子如果改成使用Lambda就会简单许多: Runnable noArgs = ()->System.out.print

  • java8中lamba表达式的使用

    (-1)前言 学习lamba表达式是十分重要的,你会发现java变的可爱多了. (0)函数式接口 只有一个方法的接口称为函数式接口 JButton jButton = new JButton("123"); jButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) {}}); 等同于 jButton.addActionListener(e-&

  • 一文带你掌握Java8中Lambda表达式 函数式接口及方法构造器数组的引用

    目录 函数式接口概述 函数式接口示例 1.Runnable接口 2.自定义函数式接口 3.作为参数传递 Lambda 表达式 内置函数式接口 Lambda简述 Lambda语法 方法引用 构造器引用 数组引用 函数式接口概述 只包含一个抽象方法的接口,称为函数式接口. 可以通过 Lambda 表达式来创建该接口的对象. 可以在一个接口上使用 @FunctionalInterface 注解,这样做可以检查它是否是一个函数式接口.同时 javadoc 也会包含一条声明,说明这个接口是一个函数式接口.

  • Java8中Lambda表达式的理解与应用

    目录 简介 正文 1. lambda的语法 2. 为啥引入lambda 3. 什么是函数式接口 4. 什么是行为参数化 5. 手写一个函数式接口 6. 常用的函数式接口 7. 什么是方法引用 8. 什么是构造引用 9. lambda表达式中引入外部变量的限制 10. lambda的组合操作 总结 简介 Lambda表达式是一个可传递的代码块,可以在以后执行一次或多次: 下面贴个对比代码: // Java8之前:旧的写法 Runnable runnable = new Runnable() { @

  • Java8中Lambda表达式使用和Stream API详解

    前言 Java8 的新特性:Lambda表达式.强大的 Stream API.全新时间日期 API.ConcurrentHashMap.MetaSpace.总得来说,Java8 的新特性使 Java 的运行速度更快.代码更少.便于并行.最大化减少空指针异常. 0x00. 前置数据 private List<People> peoples = null; @BeforeEach void before () { peoples = new ArrayList<>(); peoples

  • java8之lambda表达式用法总结

    java8之lambda表达式 目的:行为参数化 Lambda表达式是简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表.函数主体.返回类型,可能还有一个可以抛出的异常列表. Lambda的基本语法是(parameters) -> expression 或 (parameters) -> { statements; }.其中, (parameters) -> expression 的表达式中隐含了return,如 () -> 42: (parameters) ->

  • Java8中的 Lambda表达式教程

     1. 什么是λ表达式 λ表达式本质上是一个匿名方法.让我们来看下面这个例子: public int add(int x, int y) { return x + y; } 转成λ表达式后是这个样子: (int x, int y) -> x + y; 参数类型也可以省略,Java编译器会根据上下文推断出来: (x, y) -> x + y; //返回两数之和 或者 (x, y) -> { return x + y; } //显式指明返回值 可见λ表达式有三部分组成:参数列表,箭头(-&g

  • Java8中的lambda表达式入门教程

    1.基本介绍 lambda表达式,即带有参数的表达式,为了更清晰地理解lambda表达式,先上代码: 1.1 两种方式的对比 1.1.1 方式1-匿名内部类 class Student{ private String name; private Double score; public Student(String name, Double score) { this.name = name; this.score = score; } public String getName() { ret

  • 详解Java8中的Lambda表达式

    Lambda是什么 Lambda表达式,也可称为闭包,是java8的新特性,作用是取代大部分内部类,优化java代码结构,让代码变得更加简洁紧凑. Lambda的基本语法 (expression)->expression 或 (expression)->{statements;} Lambda最重要特点 用()->{}代码块替代匿名内部类 //(param)->expression;//(param)->statment;//(param)->{statments};/

  • 详解Java8中的lambda表达式、::符号和Optional类

    Java8中的lambda表达式.::符号和Optional类 0. 函数式编程 函数式编程(Functional Programming)属于编程范式(Programming Paradigm)中的用语,此外还有命令式编程(Imperative Programing)等,有兴趣的同学可以自行了解,我们这里大概解释一下函数式编程,在函数式编程中,输入一旦确定了,输出都确定了,函数调用的结果只依赖于传入的输入变量和内部逻辑,不依赖于外部,这样的写出的函数没有副作用.举个例子: public cla

随机推荐