(-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));

(5)好文推荐

  我读了两遍

  http://www.cnblogs.com/figure9/archive/2014/10/24/4048421.html

  http://www.cnblogs.com/GYoungBean/p/4301557.html

  第三篇没有找到,那位小伙伴提供下!

java8-lamba表达式的使用-遁地龙卷风的更多相关文章

  1. Java8中list.sort的lamba表达式

    最近写代码,需要对list集合排序,IDEA总是黄色警告: Reports calls to Collections.sort(list, comparator) which could be rep ...

  2. jquery toggle方法使用出错?请看这里-遁地龙卷风

    这个函数在1.9之前和1.9之后的用法大不相同 1 1.9之间,用于点击元素时函数的轮流执行 toggle(function() { alert(1);//1,3,5,7... },function( ...

  3. 逻辑思维面试题-java后端面试-遁地龙卷风

    (-1)写在前面 最近参加了一次面试,对笔试题很感兴趣,就回来百度一下.通过对这些题目的思考让我想起了建模中的关联,感觉这些题如果没接触就是从0到1,考验逻辑思维的话从1到100会更好,并且编程简易模 ...

  4. JQuery data方法的使用-遁地龙卷风

    (-1)说明 我用的是chrome49,这个方法涉及到JQuery版本问题,我手里有3.0的,有1.9.1,后面将1.9.1及其以前的称为低版本,3.0称为高版本 测试例子用到的showMessage ...

  5. JQuery simpleModal插件的使用-遁地龙卷风

    (0)写在前面 jquery.simpleModal.浏览器这三者的兼容性,不仅显示在报错上,还体现在所呈现的效果不是预期上. 说一下我的环境 jquery-1.8.3.js jquery.simpl ...

  6. Java8 Lumbda表达式 初步

    Java8 Lumbda表达式 初步 package com.stono.test; import java.util.function.BinaryOperator; public class Te ...

  7. java8 Lambda表达式的新手上车指南(1)

    背景 java9的一再推迟发布,似乎让我们恍然想起离发布java8已经过去了三年之久,java8应该算的上java语言在历代版本中变化最大的一个版本了,最大的新特性应该算得上是增加了lambda表达式 ...

  8. java8 Lambda表达式的新手上车指南(1)--基础语法和函数式接口

    背景 java9的一再推迟发布,似乎让我们恍然想起离发布java8已经过去了三年之久,java8应该算的上java语言在历代版本中变化最大的一个版本了,最大的新特性应该算得上是增加了lambda表达式 ...

  9. Java8 Lambda表达式详解手册及实例

    先贩卖一下焦虑,Java8发于2014年3月18日,距离现在已经快6年了,如果你对Java8的新特性还没有应用,甚至还一无所知,那你真得关注公众号"程序新视界",好好系列的学习一下 ...

随机推荐

  1. 【uoj57】 WC2013—平面图

    http://uoj.ac/problem/57 (题目链接) 题意 给出二位平面上n个点,点之间有一些连线,连线不在顶点之外的地方相交,将平面分为若干个区域.给出一些询问点对,问从这个点所在的区域走 ...

  2. PHP+AJAX 地区三级联动代码

    <html><head><meta http-equiv="Content-Type" content="text/html; charse ...

  3. Djanto static静态文件配置

    django的settings中包含三个static相关设置项: STATIC_ROOT STATIC_URL STATICFILES_DIRS   STATIC_URL 好理解,就是映射到静态文件的 ...

  4. Java 之 web.xml(Java之负基础实战)

    多个web.xml会同时生效,先加载tomcat下的web.xml,再加载网站目录下的web.xml. 1.tomcat自带的web.xml 在tomcat的conf目录下 2.自定义web.xml ...

  5. HTML 相同name 传递一个数组

    今天发现一个很厉害的东西 在input表单中,name名称可以是一个,后面[],里面跟名称,和数组一样,传递到PHP中也是一个数组 <html> <body> <form ...

  6. Struts2拦截器介绍

    一.拦截器简介 Struts拦截器和Action的关系如图: 为了在使用拦截器时制定参数值,应通过<interceptor-ref -/>元素添加<param -/>子元素来为 ...

  7. Android常用开发工具的用法

    1.在命令行创建.删除和浏览AVD 在命令行下管理AVD需要借助于android命令(位于Android SDK安装目录的tools子目录下),如果直接执行android子命令将会启动Android ...

  8. JavaScript的4种this调用模式

    方法调用模式:函数调用模式:构造器调用模式:apply调用模式: 方法调用模式: 当一个函数被保存为对象的一个属性时,我们称它为一个方法.当一个方法被调用时,this被绑定到该对象. 函数调用模式: ...

  9. MyBatis 多个查询条件的传递

    <!-- 方法1,构建查询对象: QueryCondition qc = new QueryCondition(); qc.setGender(1); qc.setBirthday(new Da ...

  10. 基于ASIO的协程库orchid简介

    什么是orchid? orchid是一个构建于boost库基础上的C++库,类似于python下的gevent/eventlet,为用户提供基于协程的并发模型. 什么是协程: 协程,即协作式程序,其思 ...