java8中lamba表达式的使用

网友投稿 209 2023-06-09


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 lol = (x,y)->x-y;

  Comparator lol = (x,y)->{System.out.println(x+y);return x-y;};

  new Comparator() {

  @Override

  public int compare(Integer o1, Integer o2) {

  // TODO Auto-generated method stub

  return 0;

  }

};

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

这时编译通过Comparator中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都需要编译器根据上下文进行类型推导

Consumer  代表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 strings = shapelist.stream().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 转换成ArrayList、Set、HashMap,HashMap甚至是更复杂的

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 colorList = new ArrayList(){

  {

  add("Red");

  add("Blue");

  add("Yellow");

  }

  };

  List shapeList = colorList.stream().map(Shape::new).http://collect(Collectors.toList());

  List colos = shpaeList.stream().map(s->s.getColor()).collect(Collectors.toList());

  Set colosSet = shpaeList.ssUtFItMVtream().map(s->s.getColor()).collect(Collectors.toSet());

  Map colorMap = colorList.stream().collect(Collectors.toMap(a->a,s->s));

  Map shapesMap = shpaeList.stream().collect(Collectors.toMap(s->http://s.getColor(), http://s->s));

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

Map> shapeMapSet = shpaeList.stream().collect(Collectors.groupingBy(s->s.getColor(),Collectors.toSet()));

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java输入字母来判断星期几的实现代码
下一篇:Bootstrap3 模态框使用实例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~