| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> Lambda表达式 -> 正文阅读 |
|
[Java知识库]Lambda表达式 |
一、概念1.lambda表达式:特殊的匿名内部类,语法更简洁 2.lambda表达式:允许把函数作为一个方法的参数(函数作为方法参数传递),将代码像数据一样传递 二、lambda的语法由三部分组成: (数据类型? 变量名,数据类型? 变量名)->{ ??????? 方法体 } (参数类型? 参数名称):参数列表 {代码体}:方法体 ->:箭头。分割参数列表和方法体 三、初体验lambda表达式public class Test01 { public static void main(String[] args) { Runnable runnable=()->{ System.out.println("这是lambda表达式:"+Thread.currentThread().getName()); }; new Thread(runnable).start();//开启线程 } } 四、练习1①练习无参无返回值的lambda //练习无参返回值的Lambda public class Test03 { public static void main(String[] args) { //1.自己创建一个User接口的实现类,并创建该类的对象 User user=new UserImpl();//多态 setShow(user); //2.使用匿名内部类 User user1=new User() { @Override public void show() { System.out.println("这是user的匿名实现类"); } }; setShow(user1); System.out.println("======================================"); //3.使用Lambda表达式 User user2=()->{ System.out.println("lambda表达式"); }; setShow(user2); } public static void setShow(User user){ user.show(); } } interface User{ public void show(); } class UserImpl implements User{ @Override public void show() { System.out.println("这是User实现方法"); } } ②有参有返回值 public class Tset01 { public static void main(String[] args) { List<People> people = new ArrayList<>(); people.add(new People("zhang",12)); people.add(new People("liu",23)); people.add(new People("san",13)); //按照年龄排序 Comparator<People> comparator=new Comparator<People>() { @Override public int compare(People o1, People o2) { return o1.getAge()-o2.getAge(); } }; Collections.sort(people,comparator); System.out.println(people); Comparator<People> comparator1=(o1,o2)->{ return o1.getAge()-o2.getAge(); }; Collections.sort(people,comparator1); System.out.println(people); } } @Data @NoArgsConstructor @AllArgsConstructor class People{ private String name; private int age; } 五、lombda表达式的使用前提①方法的参数或局部变量类型必须为接口才能使用Lambda ②接口中有且仅有一个抽象方法(需要设置@FunctionalInterface) 六、缩写版规则: 1.小括号内的参数类型可以省略 2.如果小括号内有且仅有一个参数,则小括号可以省略 3.如果大括号内有且仅有一个语句,可以同时省略大括号,return关键字及语句分号 public class Test01 { public static void main(String[] args) { User user=(String name,int age)->{ return name+age; }; geUer(user); User user1=(name,age)->name+"--"+age;//可以省略参数的类型,以及{}和return和分号 geUer(user1); Student student=(name)->{ System.out.println("wwww"+name); }; getStudent(student); Student student1=name -> { System.out.println("jiao"+name); }; getStudent(student1); } //1.方法的参数必须是一个接口类型 //2.该接口有且仅有一个抽象方法 public static void geUer(User user){ String show = user.show("zhang", 12); System.out.println(show); } public static void getStudent(Student student){ student.print("ddddd"); } } @FunctionalInterface//防止别人在该接口中添加新的抽象方法,可以使用注解@FunctionalInterface interface User{ public String show(String name,int age); default void fun(){};//默认 } interface Student{ public void print(String name); } 七、JDK1.8后新增的哪些:JDK1.8以前: public interface? 接口名{ ??????? //静态常量 ??????? //抽象方法 } JDK1.8后: public interface? 接口名{ ??????? //静态常量 ??????? //抽象方法 ??????? //默认方法 ??????? //静态方法 } ①默认方法: 格式: 修饰符? default? 返回类型? 方法名(){} public interface Teacher { public static final String name=""; public abstract void show(); //如果接口新增一个方法,它的所有实现类必须重写该方法,不利于接口的扩展 public abstract void print(); default void app(){}; } class User implements Teacher{ @Override public void show() { System.out.println("user重写了"); } @Override public void print() { } } class Student implements Teacher{ @Override public void show() { System.out.println("student重写了"); } @Override public void print() { } } ②静态方法 格式: 修饰符? static 返回类型? 方法名(){} 静态方法的使用: 接口中的静态方法在实现类中是不能被重写的,调用的话只能通过接口类来实现:接口名.静态方法(); public interface User { public static final String a=""; public abstract void app(); public default void he(){//默认方法可以被重写。只能通过对象调用 System.out.println("默认方法he"); } public static void su(){//静态方法不能被重写,只可以通过接口名调用 System.out.println("这是接口中的静态方法"); } } class He implements User{ @Override public void app() { System.out.println("app"); } @Override public void he() { User.super.he(); } } 八、默认方法和静态方法的区别:1.默认方法通过实例调用,静态方法通过接口名调用 2.默认方法可以被继承,实现类可以直接调用接口默认方法,也可以重写默认方法 3.静态方法不能继承,实现类不能重写接口的静态方法,只能使用接口名调用 九、函数式接口:1.Consumer:消费型函数式接口,有参无返回值void? accept(T t) 2.Funtion:函数型函数式接口,有参有返回值R apply(T t) 3.Supper:供给型函数式接口,无参有返回值T get(); 4.Predicate<T> 断言型函数式接口,有参有返回值? boolean? test(T t) |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 7:41:02- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |