Java8的Lambda表达式简介

  先阐述一下JSR(Java Specification Requests)规范,即Java语言的规范提案。是向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,可以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。可以理解为JSR是Java开发者以及授权者指定的标准,而Java开发者以及授权者形成一个JCP国际组织。职能是制定Java标准,即所有的规范都是有迹可循的。

  在Java8中推出的lambda表达式(参考JSR-335,地址为https://jcp.org/en/jsr/detail?id=335),官方的描述是:扩展Java语言以支持紧凑的lambda表达式(闭包),以及相关的语言和库功能,以使JavaSE的API能够使用lambda有效表达。通俗的理解为通过lambda表达式的本质是语法糖(Syntactic sugar,在计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员使用。语法糖让程序更加简洁,有更高的可读性),其底层还是通过编译器自动推断并生成匿名类来实现。可以使用更少的代码来实现同样的功能,使代码简洁的同时也使得Java支持闭包的功能。详见list.stream()和java.util.function包下提供了诸多的function接口。

  lambda表达式的语法:

     (parameters) -> expression 或

     (parameters) -> { statements; },

    即() -> {},等同于 new Interface(){}

  讲了一堆废话,贴代码吧:

package com.mengyao.bigdata.lambda;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Map、List和class的lambda使用
 * lambda本质是 (parameters) -> expression; 或者 (parameters) -> { statements; }。即() -> {},等同于 new Interface(){}
 * @author mengyao
 *
 */
public class Test1 {

    public static void main(String[] args) {
        // ==== 1 ==== Map的lambda示例,jdk8之前的写法就不贴出来了
        Map<String, Integer> map = new HashMap<String, Integer>() {{
            put("spark", 1);
            put("storm", 1);
            put("hadoop", 1);
            put("flink", 1);
        }};
        /**
         * parameters确定
         *         map.forEach参数为java.util.function.BiConsumer<? super String, ? super Integer> action,是一个接口的声明,
         *         实现采用的是for(Map.Entry<K, V> entry : entrySet())将entry的k和v作为参数传递到action.accept(k,v)中 验证,到此k,v参数已确定。
         * expression使用
         *         接下来是给到lambda的expression来使用
         * 所以如下3个map.forEach同理
         */
        map.forEach((k,v) -> System.out.println(k+":"+v));
        map.forEach((k,v) -> {System.out.println(k+":"+v);});
        map.forEach((k,v) -> {
            if (k.equals("spark")) {
                System.out.println(k+":"+v);
            }
        });

        System.out.println("====");

        // ==== 2 ==== List的lambda示例
        List<String> list = new ArrayList<String>(10) {{
            add("spark");
            add("storm");
            add("hadoop");
            add("flink");
        }};
        // 与map.forEach同理
        list.forEach(System.out::println);//System.out是PrintStream的实例,::println即为调用System.out对象的println方法
        list.forEach(item -> System.out.println(item));
        list.forEach(item -> {System.out.println(item);});
        list.forEach(item -> {
            if (item.equals("spark")) {
                System.out.println(item);
            }
        });

        //==== 3 ==== 自定义类的lambda使用
        // 接口类非lambda方式使用
        System.out.println("==== "+new MathService() {
            @Override
            public int plus(int a, int b) {
                return a+b;
            }
        }.plus(1, 2));

        // 接口类lambda方式使用1(实现plus方法)
        MathService service = (a,b) -> a+b;
        System.out.println("==== "+service.plus(1, 2));
        // 接口类lambda方式使用2,将接口的实现作为参数
        print((a,b)->a+b);

    }

    /**
     * 使用接口作为参数,通常方法内部会调用接口的方法
     * @param service
     */
    static void print(MathService service) {
        int a =1,b=2;
        System.out.println(service.plus(a, b));
    }

}
interface MathService {
    //return a+b
    int plus(int a, int b);
}

  补充一下,稍后会上传一些复杂用例。

原文地址:https://www.cnblogs.com/mengyao/p/10211980.html

时间: 2024-08-24 15:57:12

Java8的Lambda表达式简介的相关文章

Java8特性Lambda表达式

Lambda 表达式 简介: Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). (parameters) -> expression 或 (parameters) ->{ statements; } 使用 Lambda 表达式需要注意以下两点: Lambda 表达式主要用来定义行内执行的方法类型接口,例如,一个简单方法接口.在上面例子中,我们使用各种类型的Lambda表达式来定义MathO

java8之lambda表达式(方法引用)

有些时候,你想要传递给其他代码的操作已经有实现的方法了.示例: button.setOnAction(event -> System.out.println(event); 如果你能够只将println方法传递给setOnAction方法,就更好了!下面是改后的代码: button.setOnAction(System.out::println); 表达式System.out::println是一个方法引用,等同于lambda表达式: x -> System.out.println(x) 正如

java8之lambda表达式(变量作用域)

通常,我们希望能够在lambda表达式的闭合方法或类中访问其他的变量,例如: package java8test; public class T1 {     public static void main(String[] args) {         repeatMessage("Hello", 20);     }     public static void repeatMessage(String text,int count){         Runnable r = 

java8之lambda表达式(1)-基本语法

参考:http://www.cnblogs.com/andywithu/p/7344507.html lambda表达式,即带有参数的表达式,为更清晰地理解lambda表达式,先看如下例子: (1) class Student{ private String name; private Double score; public Student(String name, Double score) { this.name = name; this.score = score; } public S

JAVA8之lambda表达式详解,及stream中的lambda使用

原文:http://blog.csdn.net/jinzhencs/article/details/50748202 lambda表达式详解 一.问题 1.什么是lambda表达式? 2.lambda表达式用来干什么的? 3.lambda表达式的优缺点? 4.lambda表达式的使用场景? 5.lambda只是一个语法糖吗? 二.概念 lambda表达式是JAVA8中提供的一种新的特性,它支持Java也能进行简单的"函数式编程". 它是一个匿名函数,Lambda表达式基于数学中的λ演算

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表达式(函数式接口)

在Java中有许多已有的接口都需要封装代码块,例如:Runnable或者Comparator.lambda表达式与这些接口是向后兼容的.对于只包含一个抽象方法的接口,你可以通过lambda表达式来创建该接口的对象,这种接口被称为函数式接口.注意:Java8中接口可以声明非抽象的方法. 为了演示函数式接口转换,我们以Arrays.sort方法为例.该方法的第二个参数需要一个Comparator接口(该接口只含有一个方法)的实例.接下来我们编写一个简单的lambda表达式: Arrays.sort(

java8之lambda表达式看这一篇就够了

java8增加了许多新特性,其中lambda表达式可以说为最重要的特性之一,本文将从如下几个方面来学习lambda:     1.lambda表达式的基本定义   2.lambda表达式的语法   3.lambda表达式基本示例 一.何为lambda表达式? 简单点说lambda为一种匿名函数,它既没有名字也没有声明的方法.访问修饰符和返回值等.它允许将函数作为方法的参数进行传递. 二.基本语法:lambda通常包含如下几种书写方式 () -> expression () -> {  stat

Java8 之 lambda 表达式、方法引用、函数式接口、默认方式、静态方法

今天我来聊聊 Java8 的一些新的特性,确实 Java8 的新特性的出现,给开发者带来了非常大的便利,可能刚刚开始的时候会有点不习惯的这种写法,但是,当你真正的熟悉了之后,你一定会爱上这些新的特性的,这篇文章就来聊聊这些新特性. lambda 表达式 lambda 表达式在项目中也是用到了,这种新的语法的加入,对于使用 Java 多年的我,我觉得是如虎添翼的感觉哈,这种新的语法,大大的改善了以前的 Java 的代码,变得更加的简洁,我觉得这也是为什么 Java8 能够很快的流行起来的原因吧.