广告
返回顶部
首页 > 资讯 > 精选 >JDK中Lambda表达式的操作
  • 599
分享到

JDK中Lambda表达式的操作

2023-06-15 12:06:28 599人浏览 安东尼
摘要

这篇文章主要介绍“jdk中Lambda表达式的操作”,在日常操作中,相信很多人在JDK中Lambda表达式的操作问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JDK中Lambda表达式的操作”的疑惑有所帮助!

这篇文章主要介绍“jdk中Lambda表达式的操作”,在日常操作中,相信很多人在JDK中Lambda表达式的操作问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JDK中Lambda表达式的操作”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、Lambda表达式的介绍

  • Lambda表达式是 Java8 中最重要的新功能之一。使用 Lambda 表达式可以替代只有一个抽象函数的接口实现,告别匿名内部类,代码看起来更简洁易懂。Lambda表达式同时还提升了对集合框架的迭代、遍历、过滤数据的操作。

  • lambda表达式可以替代只有一个抽象函数的接口实现,告别匿名内部类,代码看起来更简洁易懂

  • lambda表达式同时还提升了对集合、框架的迭代、遍历、过滤数据的操作

  • lambda可以极大的减少代码冗余,同时代码的可读性要好过冗长的内部类,匿名类

例如以前我们使用匿名内部类来实现代码:

Runnable runnable = new Runnable() {        @Override        public void run() {            System.out.println("running1 .....");        }    };    runnable.run();

使用lambda表达式实现更简洁的代码:

Runnable runnable3 = ()-> System.out.println("running2....");     runnable3.run();

lambda表达式语法:

LambdaParameters -> LambdaBody

 JDK中Lambda表达式的操作

在这里插入图片描述

args -> expr或者(object … args)-> {函数式接口抽象方法实现逻辑}

()参数的个数,根据函数式接口里面抽象的参数个数来决定,当参数只有一个的时候,()可以省略

当expr逻辑非常简单的时候,{}和return可以省略

案例说明:

public static void main(String[] args) throws Exception {       Callable<String> c1 = new Callable() {           @Override           public String call() throws Exception {               return "muxiaonong";           }       };       System.out.println(c1.call());        Callable<String> c2 = ()->{return "muxiaonong2";};       System.out.println(c2.call());        //逻辑很简单的时候省略 {} 和 return       Callable<String> c3 = ()->"muxiaonong3";       System.out.println(c3.call());   }

二、Lambda表达式的特点

  • 函数式编程

  • 参数类型自动推断

  • 代码量少,简洁

三、Lambda表达式案例

实现方式列表:

()->{}        ()->{System.out.println(1);}        ()->System.out.println(1)        ()->{return 100;}        ()->100        ()->null        (int x)->{return x+1;}        (int x)->x+1        (x)->x+1        x->x+1

案例1:线程实现方式:

public static void main(String[] args) {       //匿名内部类方式       new Thread(new Runnable() {           @Override           public void run() {               System.out.println("runing1..........");           }       });        //Lambda表达式方式       new Thread(() -> {System.out.println("runing2.....");}).start();   }

案例2:集合遍历实现方式

public static void main(String[] args) {       List<String> list = Arrays.asList("java","python","Scala","javascript");        //普通匿名内部类方式       Collections.sort(list, new Comparator<String>() {           @Override           public int compare(String o1, String o2) {               return o1.length() - o2.length();           }       });        //Lambda方式       Collections.sort(list,(a,b) -> a.length() - b.length());       list.forEach(System.out::println);   }

四、Lambda表达式的应用场景

重要的事情说三遍:任何有函数式接口的地方 * 3

什么是函数式接口: 只有一个抽象方法(Object类中的方法除外)的接口是函数式接口

五、Lambda表达式实际应用

1 无参实体类模拟

模拟数据库连接层:

@FunctionalInterface public interface StudentDao {     void insert(Student student); }

实体类

 public class Student { }  public static void main(String[] args) {         StudentDao sd1 = new StudentDao() {             @Override             public void insert(Student student) {                 System.out.println("插入学生1");             }         };          StudentDao sd2 = (student)->{             System.out.println("student: "+student);         };          StudentDao sd3 = (Student student)-> System.out.println("student3:"+student);          sd1.insert(new Student()); //输出 插入学生1         sd2.insert(new Student());// 输出         sd3.insert(new Student());// 输出     }

2 有参实体类模拟

实体类

 public class Teacher { }

接口模拟层

@FunctionalInterface public interface TeacherDao {     int get(Teacher teacher); }

实现层

 public static void main(String[] args) {         TeacherDao td1 = new TeacherDao() {             @Override             public int get(Teacher teacher) {                 return 1;             }         };         TeacherDao td2 = (teacher)->{return 2;};         TeacherDao td3 = (Teacher teacher)->{return 3;};         TeacherDao td4 = (teacher)->4;         TeacherDao td5 = (Teacher teacher)->5;          System.out.println(td1.get(new Teacher()));//输出 1         System.out.println(td2.get(new Teacher()));//输出 2         System.out.println(td3.get(new Teacher()));//输出 3         System.out.println(td4.get(new Teacher()));//输出 4         System.out.println(td5.get(new Teacher()));//输出 5 }

六、函数式接口

Supplier:代表一个输出

Consumer:代表一个输入

BiConsumer:代表两个输入

Function:代表一个输入,一个输出(一般输入和输出是不同类型的)

UnaryOperator:代表一个输入,一个输出(输入和输出是相同类型的)

BiFunction:代表两个输入,一个输出(一般输入和输出是不同类型的)

BinaryOperator:代表两个输入,一个输出(输入和输出是相同类型的)

在Java中提供了一系列的函数式接口,用来接受后续传入的逻辑,但是对输入和输出有要求

1 Supplier:代表一个输出

Supplier<String> s1 = ()->{return "muxiaonong";};     Supplier<String> s2 = ()->"muxiaonong2";     System.out.println(s1.get());//输出 muxiaonong     System.out.println(s2.get());//输出 muxiaonong2

2 Consumer:代表一个输入

Consumer<String> c11 = (str) -> System.out.println(str);    c11.accept("beijing");//输出 beijing

3 BiConsumer:代表两个输入

BiFunction<String,String,Integer> bf = (a,b)->a.length()+b.length();      System.out.println(bf.apply("大吉大利", "今晚吃鸡"));//输出一个字符串长度 8

4 Function:代表一个输入,一个输出

//  Function<String,Integer>  用来接收后面的函数的实现,规定必须有一个输入(String)有一个输出(Integer)  Function<String,Integer> f1 = (str)->{return str.length();};  System.out.println(f1.apply("abcdefg"));//输出长度 7

七、方法的引用

方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法,方法引用提供了一种引用而不执行方法的方式,如果抽象方法的实现恰好可以使用调用另外一个方法来实现,就有可能可以使用方法引用

1  方法引用的分类

JDK中Lambda表达式的操作

2 静态方法引用

静态方法引用: 如果函数式接口的实现恰好可以通过 调用一个静态方法 来实现,那么就可以使用静态方法引用

 public class Test2 {     //无参静态方法      static String put(){             System.out.println("put.....");             return "put";         }      //有参静态方法     public static void getSize(int size){             System.out.println(size);         }       //有参 有返回值静态方法      public static String toUpperCase(String str){             return str.toUpperCase();         }      //两个入参,一个返回值静态方法     public static Integer getLength(String str,String str2){         return str.length()+str2.length();     }        public static void main(String[] args) {         //无参静态方法-普通调用         System.out.println(put());//输出put         //无参静态方法-原生调用         Supplier<String> s1 = ()-> Test2.put();         System.out.println(s1.get());//输出put         //无参静态方法-静态方法引用         Supplier<String> s2 = Test2::put;         System.out.println(s2.get());//输出put         //无参静态方法-内部类调用         Supplier<String> s3 = Fun::hehe;         System.out.println(s3.get()); //输出hehe          // 有参静态方法-静态方法引用         Consumer<Integer> c1 = Test2::getSize;         Consumer<Integer> c2 = (size)-> Test2.getSize(size);         c1.accept(123);         c2.accept(111);          //有参有返回值静态方法         Function<String,String> f1 = (str)->str.toUpperCase();         Function<String,String> f2 = (str)-> Test2.toUpperCase(str);         Function<String,String> f3 = Test2::toUpperCase;         Function<String,String> f4 = Test2::toUpperCase;          System.out.println(f1.apply("abc"));//输出 ABC          System.out.println(f2.apply("abc"));//输出 ABC          System.out.println(f3.apply("abc"));//输出 ABC          System.out.println(f4.apply("abc"));//输出 ABC           // 两个参数 一个返回值 函数式接口          BiFunction<String,String,Integer> bf = (a, b)->a.length()+b.length();         BiFunction<String,String,Integer> bf2 = Test2::getLength;         System.out.println(bf2.apply("abc", "def"));//输出 6         System.out.println(bf.apply("abc", "def"));//输出 6      }      //内部类     class Fun {         public static String hehe(){             return "hehe";         }          public static String toUpperCase(String str){             return str.toUpperCase();         }      }  }

3 实例方法引用

实例方法引用: 如果函数式接口的实现恰好可以通过调用一个实例的实例方法来实现,那么就可以使用实例方法引用

public class Test3 {     //实例无参方法     public String put(){         return "put...";     }      //实例有参方法     public void getSize(int size){         System.out.println("size:"+size);     }      //实例有参有返回值方法     public String toUpperCase(String str){         return  str.toUpperCase();     }     public static void main(String[] args) {         //实例无参方法返回-普通调用         System.out.println(new Test3().put());//输出 put...         Supplier<String> s1 = ()->new Test3().put();         Supplier<String> s2 = ()->{return new Test3().put();};         Supplier<String> s3 = new Test3()::put;         System.out.println(s1.get());//输出 put...         System.out.println(s2.get());//输出 put...         System.out.println(s3.get());//输出 put...          //唯一的创建一个test3对象         Test3 test = new Test3();          Consumer<Integer> c1 = (size)->new Test3().getSize(size);         Consumer<Integer> c2 = new Test3()::getSize;         Consumer<Integer> c3 = test::getSize;           c1.accept(123);//输出 size:123         c2.accept(123);//输出 size:123         c3.accept(123);//输出 size:123          Function<String,String> f1 = (str)->str.toUpperCase();         Function<String,String> f2 = (str)->test.toUpperCase(str);         Function<String,String> f3 = new Test3()::toUpperCase;         Function<String,String> f4 = test::toUpperCase;         System.out.println(f1.apply("abc"));//输出 ABC         System.out.println(f2.apply("abc"));//输出 ABC         System.out.println(f3.apply("abc"));//输出 ABC         System.out.println(f4.apply("abc"));//输出 ABC     } }

4 对象方法引用

对象方法引用:  抽象方法的第一个参数类型刚好是实例方法的类型,抽象方法剩余的参数恰好可以当做实例方法的参数。如果函数式接口的实现能由上面说的实例方法调用来实现的话,那么就可以使用对象方法引用

 public class Test4 {     public static void main(String[] args) {         Consumer<Too> c1 = (too)->new Too().foo();         c1.accept(new Too());//输出 foo          Consumer<Too> c2 = (Too too) ->new Too2().foo();         c2.accept(new Too());//输出 foo---too2          Consumer<Too> c3 = Too::foo;         c3.accept(new Too());//输出 foo          BiConsumer<Too2,String> bc = (too2,str)->new Too2().show(str);         BiConsumer<Too2,String> bc2 = Too2::show;         bc.accept(new Too2(),"abc");         bc2.accept(new Too2(),"def");          BiFunction<Exec,String,Integer> bf1 = (e,s)->new Exec().test(s);         bf1.apply(new Exec(),"abc");         BiFunction<Exec,String,Integer> bf2 = Exec::test;         bf2.apply(new Exec(),"def");     } }  class Exec{     public int test(String name){         return 1;     }  }  class Too{     public Integer fun(String s){         return 1;     }     public void foo(){         System.out.println("foo");     } } class Too2{     public Integer fun(String s){         return 1;     }     public void foo(){         System.out.println("foo---too2");     }      public void show(String str){         System.out.println("show ---too2"+str);     } }

5 构造方法引用

构造方法引用: 如果函数式接口的实现恰好可以通过调用一个类的构造方法来实现,那么就可以使用构造方法引用

 public class Test5 {     public static void main(String[] args) {         Supplier<Person> s1 = ()->new Person();         s1.get();//输出 调用无参的构造方法         Supplier<Person> s2 = Person::new;         s2.get();//输出 调用无参的构造方法          Supplier<List> s3 = ArrayList::new;         Supplier<Set> s4 = HashSet::new;         Supplier<Thread> s5 = Thread::new;         Supplier<String> s6 = String::new;          Consumer<Integer> c1 = (age)->new Account(age);         Consumer<Integer> c2 = Account::new;         c1.accept(123);// 输出 age 参数构造123         c2.accept(456);//输出 age 参数构造456          Function<String,Account> f1 = (str)->new Account(str);         Function<String,Account> f2 = Account::new;         f1.apply("abc");//输出 str 参数构造abc         f2.apply("def");//输出 str 参数构造def      } }  class Account{     public Account(){         System.out.println("调用无参构造方法");     }      public Account(int age){         System.out.println("age 参数构造" +age);     }      public Account(String str){         System.out.println("str 参数构造" +str);     } }  class Person{     public Person(){         System.out.println("调用无参的构造方法");     } }

到此,关于“JDK中Lambda表达式的操作”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: JDK中Lambda表达式的操作

本文链接: https://www.lsjlt.com/news/280321.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JDK中Lambda表达式的操作
    这篇文章主要介绍“JDK中Lambda表达式的操作”,在日常操作中,相信很多人在JDK中Lambda表达式的操作问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JDK中Lambda表达式的操作”的疑惑有所帮助!...
    99+
    2023-06-15
  • 浅谈Java中Lambda表达式的相关操作
    为什么要使用Lambda? 可以对一个接口进行非常简洁的实现。 Lambda对接口的要求? 接口中定义的抽象方法有且只有一个才可以。 传统实现一个接口需要这样做: 方法一: ...
    99+
    2022-11-12
  • 【javaSE】 Lambda表达式与Lambda表达式的使用
    文章目录 🌳Lambda表达式的背景🚩Lambda表达式的语法🚩函数式接口 🎋Lambda表达式的基本使用🎄...
    99+
    2023-09-15
    开发语言 java Lambda表达式 源码
  • python数据操作之lambda表达式详情
    目录1 前言2 lambda 的特性3 lambda 的一些用法3.1 map 函数3.2 reduce 函数3.3 sorted 函数3.4 filter 函数4 总结1 前言 在...
    99+
    2022-11-10
  • C++中的Lambda表达式及表达式语句
    目录一、概念二、左值与右值三、类型转换四、操作符五、思考1、思考下面x变量是左值还是右值,有什么特性?2、思考一下以下赋值操作符的原始代码是怎样的?3、思考以下代码做了什么事情?一、...
    99+
    2022-11-12
  • Python的lambda表达式
    匿名表达式---lambda介绍匿名函数- 也是就lambda表达式。介绍几个 序列处理的函数,比如序列过滤、把所有元素都拿过来做某些操作,这种的序列处理函数。这样的函数都有一些特点,会借用别函数来进行操作。这里就会用到lambda ▷匿名...
    99+
    2023-01-31
    表达式 Python lambda
  • java lambda表达式的作用是什么
    Java lambda表达式的作用是简化代码编写,提高代码的可读性和可维护性。lambda表达式是一种匿名函数,可以作为参数传递给方...
    99+
    2023-09-23
    java
  • 进阶JAVA篇- Lambda 表达式与 Lambda 表达式的省略规则
    目录         1.0 什么是 Lambda 表达式?         1.1 既然跟匿名内部类相关,先来回顾匿名内部类。          1.2 Lambda 表达式与匿名内部类之间的关系。         1.3 函数式接口  ...
    99+
    2023-10-20
    java python 开发语言
  • C#中Lambda表达式的用法
    从C#3.0开始,可以使用lambda表达式把实现代码赋予委托。lambda表达式与委托(https://www.jb51.net/article/244051.htm)直接相关。当...
    99+
    2022-11-13
  • java8中的lambda表达式简介
    目录Lambda表达式的语法Lambda表达式作用域方法引用指向静态方法的方法引用指向任意类型实例方法的方法引用指向现有对象的实例方法的方法引用构造方法引用lambda与匿名内部类匿...
    99+
    2022-11-13
  • 关于Java 中的 Lambda 表达式
    这篇文章我们将讨论关于Java 中的 Lambda 表达式,Lambda 表达式是 Java 涉足函数式编程的过程。它接受参数并将其应用于表达式或代码块。以下是语法的基本示例: ...
    99+
    2022-11-12
  • lambda表达式在Java8中的作用有哪些
    本篇文章给大家分享的是有关lambda表达式在Java8中的作用有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.关于JSR335JSR是Java Specificati...
    99+
    2023-05-31
    java8 lambda
  • Python中的lambda表达式的用法
    本篇内容主要讲解“Python中的lambda表达式的用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中的lambda表达式的用法”吧!问:说说Python中的lambda表达式?...
    99+
    2023-06-19
  • Java中的Lambda表达式是什么
    这篇文章主要介绍“Java中的Lambda表达式是什么”,在日常操作中,相信很多人在Java中的Lambda表达式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的Lambda表达式是什么”的疑...
    99+
    2023-06-25
  • 如何在C#项目中创建一个Lambda表达式和Lambda表达式树
    如何在C#项目中创建一个Lambda表达式和Lambda表达式树?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。表达式Lambda  表达式位于 => 运算符右侧的 l...
    99+
    2023-06-06
  • Java中Lambda表达式怎么用
    这篇文章主要介绍了Java中Lambda表达式怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、前言Lambda表达式是java 8中包含的重要功能之一。Lambda表...
    99+
    2023-06-15
  • LINQ中Lambda表达式怎么用
    小编给大家分享一下LINQ中Lambda表达式怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Linq有很多值得学习的地方,这里我们主要介绍LINQ Lamb...
    99+
    2023-06-17
  • C#3.0中Lambda表达式详解
    在C#2.0中,微软给我们带来了一些新的特性,例如泛型,匿名委托等。然而,这些新的特性多多少少会给人一种从别的语言中“抄”来的感觉(例如泛型类似C++的模板,一些特性类似Java中的...
    99+
    2022-11-15
    C# Lambda
  • 简单聊聊工作中常用的Java Lambda表达式
    目录前言1. list转map2. filter()过滤3. foreach遍历4. groupingBy分组5. sorted+Comparator 排序6.distinct去重7...
    99+
    2022-11-13
    Java Lambda表达式 Java Lambda
  • 如何理解Java中的lambda表达式
    这篇文章主要介绍了如何理解Java中的lambda表达式的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何理解Java中的lambda表达式文章都会有所收获,下面我们一起来看看吧。Lambda概述Lambda表...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作