Java中Lambda表达式的使用详解

目录
  • 理解函数式接口以及 Lambda表达式的发展过程
  • Lambda表达式及语法
  • 一起来看看具体的使用
  • 你需要注意什么
  • Lambda的实际运用
    • 1.对集合排序
    • 2.遍历集合
    • 3.遍历集合(带条件)
    • 4.代替 Runnable,开启一个线程

理解函数式接口以及 Lambda表达式的发展过程

任何接口,只包含唯一一个抽象方法,就是函数式接口

/**
 * lambdab表达式的发展
 */
public class TestLambda1 {
    //3.静态内部类
    static class Like2 implements ILike{
        @Override
        public void lambda() {
            System.out.println("i like lambda2");
        }
    }

    public static void main(String[] args) {
        ILike like=new Like();
        like.lambda();

        like=new Like2();
        like.lambda();

        //4.局部内部类
       class Like3 implements ILike{
            @Override
            public void lambda() {
                System.out.println("i like lambda3");
            }
        }
        like=new Like3();
        like.lambda();

        //5.匿名内部类
        like=new ILike() {
            @Override
            public void lambda() {
                System.out.println("i like lambda4");
            }
        };
        like.lambda();

        //6.用lambda简化
        like=()->{
            System.out.println("i like lambda5");
        };
        like.lambda();
    }
}

//1.定义一个函数式接口
interface ILike{
    void lambda();
}

//2.实现类
class Like implements ILike{

    @Override
    public void lambda() {
        System.out.println("i like lambda");
    }
}

Lambda表达式及语法

Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)

// 1. 不需要参数,返回值为 5
() -> 5  

// 2. 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x  

// 3. 接受2个参数(数字),并返回他们的差值
(x, y) -> x – y  

// 4. 接收2个int型整数,返回他们的和
(int x, int y) -> x + y  

// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)

也就是说,不需要事先声明参数的类型,圆括号可以没有,大括号可以没有,返回值可以没有

一起来看看具体的使用

public class java8_Lambda_Test {
    public static final void main(String[] args) {

        Operator addOper = (a, b) -> a + b;
        Operator reduceOper = (a, b) -> a - b;
        Operator multiplyOper = (a, b) -> a * b;
        Operator DivideOper = (a, b) -> a / b;

        java8_Lambda_Test test = new java8_Lambda_Test();
        System.out.println(test.getResult(3, 3, addOper));//6
        System.out.println(test.getResult(3, 3, reduceOper));//0
        System.out.println(test.getResult(3, 3, multiplyOper));//9
        System.out.println(test.getResult(3, 3, DivideOper));//1
    }

    public int getResult(int a, int b, Operator operator) {
        return operator.convert(a, b);
    }

    public interface Operator {
        int convert(int a, int b);
        default int get(int a) {
            return a;
        }
    }
}

你需要注意什么

1.lambda 表达式只能引用标记了 final 的外层局部变量
2.可以直接在 lambda 表达式中访问外层的局部变量

Lambda的实际运用

1.对集合排序

问题描述:在一个存放了Student对象的list中,按年龄进行排序,输出排序后的list

Student类

public class Student implements Comparable<Student>{
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public int compareTo(Student student2) {
       int result =this.age - student2.age;
       return result;
    }
}
        List<Student> list=new ArrayList<>();
        Student s1=new Student();
        s1.setName("张三");
        s1.setAge(28);
        list.add(s1);
        Student s=new Student();
        s.setName("李四");
        s.setAge(22);
        list.add(s);
        sortUsingJava8(list);

        list.forEach((student) -> System.out.println(student.getName() + ":"+student.getAge()));
 // 使用 java 8 排序
    static void sortUsingJava8(List<Student> list){
        Collections.sort(list, (student1, student2) -> student1.compareTo(student2));
    }

来康康使用Java7进行排序是这样的:

    // 使用 java 7 排序
    private void sortUsingJava7(List<String> list){
        Collections.sort(list, new Comparator<String>() {
           @Override
           public int compare(String s1, String s2) {
                return s1.compareTo(s2);
            }
        });
    }

2.遍历集合

//先准备一个集合
        List<Student> list=new ArrayList<>();
        Student s1=new Student();
        s1.setName("张三");
        s1.setAge(28);
        list.add(s1);
        Student s=new Student();
        s.setName("李四");
        s.setAge(22);
        list.add(s);
//使用 lambda 表达式以及函数操作(functional operation)
  list.forEach((student) -> System.out.println(student.getName() + ":"+student.getAge()));

3.遍历集合(带条件)

 //带条件 打印年龄大于等于20的学生的姓名
        list.forEach((student)->{
            if (student.getAge()>=20)
                System.out.println(student.getName());
                });

4.代替 Runnable,开启一个线程

Runnable r = new Runnable() {
    @Override
    public void run() {
        //to do something
    }
};
Thread t = new Thread(r);
t.start();

现在这样写:

Runnable r = () -> {
    //to do something
};
Thread t = new Thread(r);
t.start();

你还可以这样写:

Thread t = new Thread(() -> {
    //to do something
    // such as for
    for(int i = 0; i < 100; i++){
        System.out.println(i);
           }
});
t.start;

到此这篇关于Java中Lambda表达式的使用详解的文章就介绍到这了,更多相关Java Lambda内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java-lambda表达式入门看这一篇就够了

    概述 Lambda表达式,也可称为闭包,是JDK8的新特性.Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中),可以使代码变的更加简洁紧凑.Lambda表达式是一个可传递的代码块,可以在以后执行一次或多次. 名字起源是以前还没有计算机时,逻辑学家Alonzo Church想要形式化的表示能有效计算的数学函数,使用了希腊字母lambda( λ \lambda λ)来标记参数,从那以后,带参数变量的表达式就被称为lambda表达式. lambda表达式本质是一个匿名函数,比如以下

  • 吊打Java面试官之Lambda表达式 Stream API

    目录 一.jdk8新特性简介 二.Lambda表达式 简单理解一下Lambda表达式 Lambda表达式的使用 三.函数式接口 1.什么是函数式接口 2.如何理解函数式接口 3.Java内置四大核心函数式接口 四.方法引用与构造器引用 方法引用 构造器引用和数组引用 五.Stream API 1.Stream API的说明 2.为什么要使用Stream API 3.创建Stream的四种方式 4.Stream的中间操作及其测试 5.Stream的终止操作及其测试 六.Optional类的使用 O

  • Java Lambda 表达式源码解析

    Java Lambda 源码分析 问题: Lambda 表达式是什么?JVM 内部究竟是如何实现 Lambda 表达式的?为什么要这样实现? 一.基本概念 1.Lambda 表达式 下面的例子中,() -> System.out.println("1") 就是一个 Lambda 表达式.Java 8 中每一个 Lambda 表达式必须有一个函数式接口与之对应.Lambda 表达式就是函数式接口的一个实现. @Test public void test0() { Runnable

  • 浅谈Java中Lambda表达式的相关操作

    为什么要使用Lambda? 可以对一个接口进行非常简洁的实现. Lambda对接口的要求? 接口中定义的抽象方法有且只有一个才可以. 传统实现一个接口需要这样做: 方法一: // 实现接口,同时必须重写接口中抽象方法 class Test implements IntrfacefN { @Override public void getUser(int a, int b) { } } // @FunctionalInterface 注解意思:函数式接口,用来做规范,有这个注解,说明此接口有且只有

  • Java中Lambda表达式基础及使用

    目录 一.举例说明 1.无参无返回 1.1 定义一个接口 1.2接口实现类 1.3 测试类 2.有参无返回代码示例 3.有参有返回 二.简单事项 1.省略模式 2.注意事项 三.Lambda表达式和匿名内部类的区别 1.所需类型不同: 2.使用限制不同: 3.实现原理不同: 标准格式: 三要素:形式参数 箭头 代码块 格式:(形式参数)->{代码块} 形式参数:如果多个参数用逗号隔开,无参留空 ->:英文中划线和大于号组成 代码块:具体要做的事 使用前提: 有一个接口 接口中有且仅有一个抽象方

  • Java语法中Lambda表达式无法抛出异常的解决

    目录 Lambda表达式无法抛出异常 1.Demo 例子 2.编译通过 lambda表达式异常应该如何处理 我们看一个例子 Lambda表达式无法抛出异常 1.Demo 例子 错误提示 - Unhandled exception: java.io.IOException; public static void main(String[] args) throws IOException{ Stream.of("a", "b", "c").forE

  • Java中Lambda表达式的使用详解

    目录 理解函数式接口以及 Lambda表达式的发展过程 Lambda表达式及语法 一起来看看具体的使用 你需要注意什么 Lambda的实际运用 1.对集合排序 2.遍历集合 3.遍历集合(带条件) 4.代替 Runnable,开启一个线程 理解函数式接口以及 Lambda表达式的发展过程 任何接口,只包含唯一一个抽象方法,就是函数式接口 /** * lambdab表达式的发展 */ public class TestLambda1 { //3.静态内部类 static class Like2 i

  • Java学习之Lambda表达式的使用详解

    目录 Lamda表达式 函数式接口 Lambda表达式的推导 函数式接口的不同类型 Lambda表达式与函数式接口的简单应用 Lambda表达式的优缺点 Lamda表达式 λ希腊字母表中排序第11位的字母,英文名称为Lambda,它Lambda表达式是Java SE 8中一个重要的新特性,允许通过表达式来代替功能接口,它与其他方法相同,提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块),实际上是属于函数式编程的概念: 语法如下: (参数) ->表达式 或

  • JSP中EL表达式的用法详解(必看篇)

    EL 全名为Expression Language EL 语法很简单,它最大的特点就是使用上很方便.接下来介绍EL主要的语法结构: ${sessionScope.user.sex} 所有EL都是以${为起始.以}为结尾的.上述EL范例的意思是:从Session的范围中,取得 用户的性别.假若依照之前JSP Scriptlet的写法如下: User user =(User)session.getAttribute("user"); String sex =user.getSex( );

  • Java中正则表达式的使用和详解(下)

    在上篇给大家介绍了Java中正则表达式的使用和详解(上),具体内容如下所示: 1.常用正则表达式 规则 正则表达式语法   一个或多个汉字 ^[\u0391-\uFFE5]+$  邮政编码 ^[1-9]\d{5}$ QQ号码 ^[1-9]\d{4,10}$  邮箱 ^[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\.){1,3}[a-zA-z\-]{1,}$  用户名(字母开头 + 数字/字母/下划线) ^[A-Za-z][A-Za-z1-9_-]+$ 手

  • Java中Lambda表达式并行与组合行为

    从串行到并行 串行指一个步骤一个步骤地处理,也就是通常情况下,代码一行一行地执行. 如果将我们常用的迭代器式的循环展开的话,就是串行执行了循环体内所定义的操作: sum += arr.get(0); sum += arr.get(1); sum += arr.get(2); //... 在书的一开始,就提到Java需要支持集合的并行计算(而Lambda为这个需求提供了可能). 这些功能将全部被实现于库代码中,对于我们使用者,实现并行的复杂性被大大降低(最低程度上只需要调用相关方法). 另外,关于

  • java中switch选择语句代码详解

    switch结构(开关语句)的语法 switch(表达式 ){ --->类型为int.char case 常量1 :--->case 结构可以有多个 //语句块1 break; --->程序跳出switch结构 case 常量n :--->常量的值不能相同 //语句块n break; default:--->和if结构中的 else作用相同 //语句块 break; } 下面看一段代码示例,有详细的注释,大家可以参考: public class SwitchStu{ /* s

  • C++学习之Lambda表达式的用法详解

    目录 简介 捕获 原理 Lambda回调 简介 Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数.Lambda表达式可以表示闭包(注意和数学传统意义上的不同). 闭包就是能够读取其他函数内部变量的函数,可以理解成“定义在一个函数内部的函数“.在本质上,闭包是将函数内部和函数外部连接起来的桥梁. C++中的Lambda表达式

  • Java 中This用法的实例详解

     Java 中This用法的实例详解 用类名定义一个变量的时候,定义的只是一个引用,外面可以通过这个引用来访问这个类里面的属性和方法. 那们类里面是够也应该有一个引用来访问自己的属性和方法纳? 呵呵,Java提供了一个很好的东西,就是 this 对象,它可以在类里面来引用这个类的属性和方法.先来个简单的例子: public class ThisDemo { String name="Mick"; public void print(String name){ System.out.pr

  • java 中enum的使用方法详解

    java 中enum的使用方法详解 enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中. 下面是我在使用 enum 过程中的一些经验和总结. 原始的接口定义常量 public interface IConstants { String MON = "Mon"; String TUE = "Tue"; String WED = "Wed"; String THU = "Thu

  • java 中自定义OutputFormat的实例详解

    java 中 自定义OutputFormat的实例详解 实例代码: package com.ccse.hadoop.outputformat; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.apa

随机推荐