lambda表达式,即带有参数的表达式,为更清晰地理解lambda表达式,先看如下例子:
(1)
  1. class Student{
  2. private String name;
  3. private Double score;
  4.  
  5. public Student(String name, Double score) {
  6. this.name = name;
  7. this.score = score;
  8. }
  9.  
  10. public String getName() {
  11. return name;
  12. }
  13.  
  14. public Double getScore() {
  15. return score;
  16. }
  17.  
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21.  
  22. public void setScore(Double score) {
  23. this.score = score;
  24. }
  25.  
  26. @Override
  27. public String toString() {
  28. return "{"
  29. + "\"name\":\"" + name + "\""
  30. + ", \"score\":\"" + score + "\""
  31. + "}";
  32. }
  33. }
  34.  
  35. @Test
  36. public void test1(){
  37. List<Student> studentList = new ArrayList<Student>(){
  38. {
  39. add(new Student("stu1",100.0));
  40. add(new Student("stu2",97.0));
  41. add(new Student("stu3",96.0));
  42. add(new Student("stu4",95.0));
  43. }
  44. };
  45. Collections.sort(studentList, new Comparator<Student>() {
  46. @Override
  47. public int compare(Student o1, Student o2) {
  48. return Double.compare(o1.getScore(),o2.getScore());
  49. }
  50. });
  51. System.out.println(studentList);
  52. }
(1)中代码调用Collections.sort方法对集合进行排序,其中第二个参数是一个类,准确地说是一个匿名内部类,sort方法调用内部类中的compare方法对list进行位置交换,因为java中的参数类型只能是类或者基本数据类型,所以虽然传入的是一个Comparator类,但是实际上需要传递的仅仅是compare方法,lambda表达式专门针对只有一个方法的接口(即函数式接口),Comparator就是一个函数式接口

  1. @FunctionalInterface
  2. public interface Comparator<T> {
  3. int compare(T o1, T o2);
  4. }
@FunctionalInterface的作用就是标识一个接口为函数式接口,此时Comparator里只能有一个抽象方法。
使用lambda表达式之后(1)中的代码改造如下
(2)
  1. public void test1_(){
  2. List<Student> studentList = new ArrayList<Student>(){
  3. {
  4. add(new Student("stu1",100.0));
  5. add(new Student("stu2",97.0));
  6. add(new Student("stu3",96.0));
  7. add(new Student("stu4",95.0));
  8. }
  9. };
  10. Collections.sort(studentList,(s1,s2)-> Double.compare(s1.getScore(),s2.getScore()));
  11. System.out.println(studentList);
  12. }
对于有多个参数的情况,语法:
     1. ambda表达式的基本格式为(x1,x2)->{表达式...};
     2. 在上式中,lambda表达式带有两个参数,因此两边的括号不能省略,而参数类型可以省略
     3. 如果表达式只有一行,那么表达式两边的花括号可以省略
另外一个常见的例子是新建一个线程,不使用lambda表达式的写法为
(3)
  1. public void testThread(){
  2. new Thread(new Runnable() {
  3. @Override
  4. public void run() {
  5. System.out.println("hello, i am thread!");
  6. }
  7. }).start();
  8. }
其中Runnable接口也是一个函数式接口,源码如下
  1. @FunctionalInterface
  2. public interface Runnable {
  3. /**
  4. * When an object implementing interface <code>Runnable</code> is used
  5. * to create a thread, starting the thread causes the object's
  6. * <code>run</code> method to be called in that separately executing
  7. * thread.
  8. * <p>
  9. * The general contract of the method <code>run</code> is that it may
  10. * take any action whatsoever.
  11. *
  12. * @see java.lang.Thread#run()
  13. */
  14. public abstract void run();
  15. }
将其转换为lambda表达式的写法为
(4)
  1. public void testThread_(){
  2. new Thread(()-> System.out.println("hello, i am thread!")).start();
  3. }
对于没有参数的情况 ,语法:
     1.参数的括号不能省略,如果只有一句的表达式则可省略花括号和语句结尾的分号
我们构造一个只有一个参数的函数式接口
  1. @FunctionalInterface
  2. public interface MyFunctionalInterface {
  3. public void single(String msg);
  4. }
  5.  
  6. /**
  7. * 需要单个参数
  8. */
  9. public static void testOnePar(MyFunctionalInterface myFunctionalInterface){
  10. myFunctionalInterface.single("msg");
  11. }
  12.  
  13. /**
  14. * 一个参数,可以省略参数的括号
  15. */
  16. @Test
  17. public void testOneParameter(){
  18. testOnePar(x-> System.out.println(x));
  19. }
对于只有一个参数的情况 ,语法:
     1.参数的括号可以省略
在这里我们为了演示只有一个参数的情况自己创建了一个函数式接口,其实java8中已经为我们提供了很多常见的函数式接口
常见的有
Function:提供任意一种类型的参数,返回另外一个任意类型返回值。 R apply(T t);
Consumer:提供任意一种类型的参数,返回空值。 void accept(T t);
Supplier:参数为空,得到任意一种类型的返回值。T get();
Predicate:提供任意一种类型的参数,返回boolean返回值。boolean test(T t);
因此针对上面的情况,我们可以直接使用Consumer类,
  1. /**
  2. * 需要单个参数
  3. */
  4. public static void testOnePar1(Consumer unaryOperator){
  5. unaryOperator.accept("msg");
  6. }
 
 
 
 

java8之lambda表达式(1)-基本语法的更多相关文章

  1. Java8之lambda表达式

    一.什么是lambda表达式? Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码 ...

  2. Java8中Lambda表达式的10个例子

    Java8中Lambda表达式的10个例子 例1 用Lambda表达式实现Runnable接口 //Before Java 8: new Thread(new Runnable() { @Overri ...

  3. java8的lambda表达式,将List<DTO> 转为 List<DO>

    将List<PhoneDTO>转为List<PhoneDO>,通过java8的lambda表达式来操作,比传统的for循环精简很多: /** * List<PhoneDT ...

  4. java8的lambda表达式

    关于java8的lambda表达式 lambda表达式一般用于接口,因为lambda表达式是函数式编程. 1.有且仅有一个抽象方法被称为函数式接口,函数式接口可以显示的被@FunctionalInte ...

  5. java8中lambda表达式的应用,以及一些泛型相关

    语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利 顺带用到一些泛型编程,一切都是为了简化代码 场景: 一个数据类,用于记录职工信息 public clas ...

  6. java8之lambda表达式入门

    1.基本介绍 lambda表达式,即带有参数的表达式,为了更清晰地理解lambda表达式,先上代码: 1.1 两种方式的对比 1.1.1 方式1-匿名内部类 class Student{ privat ...

  7. JAVA8之lambda表达式具体解释,及stream中的lambda使用

    前言: 本人也是学习lambda不久,可能有些地方描写叙述有误,还请大家谅解及指正! lambda表达式具体解释 一.问题 1.什么是lambda表达式? 2.lambda表达式用来干什么的? 3.l ...

  8. 十分钟学会Java8的lambda表达式和Stream API

    01:前言一直在用JDK8 ,却从未用过Stream,为了对数组或集合进行一些排序.过滤或数据处理,只会写for循环或者foreach,这就是我曾经的一个写照. 刚开始写写是打基础,但写的多了,各种乏 ...

  9. java8中Lambda表达式和Stream API

    一.Lambda表达式 1.语法格式 Lambda是匿名函数,可以传递代码.使用“->”操作符,改操作符将lambda分成两部分: 左侧:指定了 Lambda 表达式需要的所有参数 右侧:指定了 ...

随机推荐

  1. spring注解一次 清除多个缓存

    @Caching(evict = { @CacheEvict(value="cacheName",key="#info.id+'_baojia'",before ...

  2. jquery获得表格可见行的大小数量

    alert($("#tableId").find("tbody tr[moban='true']").find(":visible").si ...

  3. 一些css书写的小技巧

    一.css顺序 首先声明,浏览器读取css的方式是从上到下的.我们一般书写css只要元素具备这些属性就会达到我们预期的效果,但是这会给以后的维护和浏览器的渲染效率带来一定的影响,那么该怎么书写css的 ...

  4. html模板中的数字保留两位小数

    <script> //html模板中的数字保留两位小数 function formatCurrency(num) { num = num.toString().replace(/\$|\, ...

  5. jQuery 评分插件(转)

    评分效果的小插件jQuery Raty.它提供的API相当丰富真的是让人爱不释手.详细文档及下载插件请移步这里. 基本使用 下面我们来实际操作,运用一下这个有爱的小插件. 需要做的事情非常简单,在页面 ...

  6. webpackage 2.x 使用

    webpackage 2.x 使用 安装---(在项目目录下) //1.初始化npm的配置(添加package.json) npm init //2.安装 webpackage npm install ...

  7. 【ESP8266】发送HTTP请求

    一.ESP8266简介 ESP8266 是深圳安信可科技有限公司开发的基于乐鑫ESP8266的超低功耗的UART-WIFI模块的模组,可以方便进行二次元开发,接入云端服务,实现手机3/4G全球随时随地 ...

  8. 闭包JS

    一句话概括的话:闭包就是一个函数,捕获作用域内的外部绑定. 官方的定义:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因为这些变量也称为该表达式的一部分. 自由变量和闭包的关系:自 ...

  9. iOS 实现类似QQ分组样式的几种方式

    思路 思路很简单,对模型数据操作或则控制界面显示 先看下json部分数据 "chapterDtoList": [{ "token": null, "i ...

  10. 51nod_1661: 黑板上的游戏(sg函数 找规律)

    题目链接 先打一个sg函数的表,找找规律,发现sg函数可以递归求解 打表代码如下 #include<bits/stdc++.h> using namespace std; typedef ...