首页 > 编程语言 >java lambda表达式、匿名类和接口

java lambda表达式、匿名类和接口

时间:2023-11-08 13:55:05浏览次数:39  
标签:IEat java String void System 匿名 println public lambda

从匿名类重写已有类的方法开始

这段代码,在AnonymousDemo内部创建了一个Polygon类的p1对象
但这个Polygon类内部的方法被重写了,是一个匿名类,内部类和外部类重名,重写了内部的方法
这个机制应该理解为继承,内部的Polygon继承了外部的Polygon类,重写了display方法,Polygon的其他没被重写的方法应该也在内部类中,所以应该理解为继承

class Polygon {
   public void display() {
      System.out.println("在 Polygon 类内部");
   }
}


class AnonymousDemo {
   public void createClass() {

      // 内部类继承外部同名类并重写display方法
      Polygon p1 = new Polygon() {
         public void display() {
            System.out.println("在匿名类内部。");
         }
      };
      p1.display();
   }
}

class Main {
   public static void main(String[] args) {
       AnonymousDemo an = new AnonymousDemo();
       an.createClass();
   }
}

按照这个机制,就可以重写接口了,与外部接口重名的内部匿名接口

interface Polygon {
   public void display();
}

class AnonymousDemo {
   public void createClass() {

      // 匿名类实现一个接口
      Polygon p1 = new Polygon() {
         public void display() {
            System.out.println("在匿名类内部。");
         }
      };
      p1.display();
   }
}

class Main {
   public static void main(String[] args) {
      AnonymousDemo an = new AnonymousDemo();
      an.createClass();
   }
}

Lambda表达式入场
给Thread传递函数参数,我一直是以构造函数的角度来理解的,传递了一个函数对象

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

		Thread thread = new Thread(()-> {/*某耗费时间的代码*/});
		thread.start();
	}
}

从匿名类的角度来看,相当于重写了一个内部的Thread类,继承自外部的Thread类
Thread内部又重写了Runnable接口

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

		Thread thread = new Thread(new Runnable() {
			@Override
			public void run() {
				/*耗费时间的代码*/
			}
		});
		thread.start();
	}
}

如何使用Lambda简化呢
先来一个匿名类代码,匿名类实现了IEat接口的eat方法

public class test {
	//此方法调用了IEat接口中的eat方法
	public static void personEat(IEat e)
	{
		e.eat("蔬菜");
	}
	public static void main(String[] args) {
		IEat e = new IEat() {
			@Override
			public void eat(String v) {
				System.out.println("正在吃"+v);
			}
		};
		personEat(e);
	}
}
interface IEat
{
	void eat(String v);
}

改为Lambda实现

public class test {
	//此方法调用了IEat接口中的eat方法
	public static void personEat(IEat e)
	{
		e.eat("蔬菜");
	}
	public static void main(String[] args) {
		IEat e = (String v) -> {System.out.println("正在吃" + v);};
		personEat(e);
	}
}
interface IEat
{
	void eat(String v);
}

IEat e = new IEat() {
			@Override
			public void eat(String v) {
				System.out.println("正在吃"+v);
			}
		};

直接换成了一行

IEat e = (String v) -> {System.out.println("正在吃" + v);};

至此,还可以用Lambda的简化,写为

IEat e = v -> System.out.println("正在吃" + v);

最后,还可以将

	IEat e = (String v) -> {System.out.println("正在吃" + v);};
	personEat(e);

合并为一行

personEat(v -> System.out.println("正在吃" + v));

最终代码

public class test {
	//此方法调用了IEat接口中的eat方法
	public static void personEat(IEat e)
	{
		e.eat("蔬菜");
	}
	public static void main(String[] args) {
		personEat(v -> System.out.println("正在吃" + v));
	}
}
interface IEat
{
	void eat(String v);
}

最终下来,我终于看懂了这么一行代码,本质就是实现了接口方法的一个对象,这简化的太多了、、、小白阅读起来真是一头雾水
IEat e = v -> System.out.println("正在吃" + v);
这么简单的一行,既定义了一个IEat的对象e,也实现了接口IEat的方法
实现和定义对象同时进行

标签:IEat,java,String,void,System,匿名,println,public,lambda
From: https://www.cnblogs.com/lxzbky/p/17817162.html

相关文章

  • 【Java SE】String.format格式化
    String.format1、字符串左对齐,不足10位的右侧补空格:[123      ]String.format("%-10s","123");2、字符串右对齐,不足10位的左侧补空格:[      123]String.format("%10s","123");3、整数格式化10位,不足左侧补0:[0000000123]String.format("%010d",123) ......
  • Java根据日期计算星期几的四种方法
    在我们日常业务代码中,经常要用到星期几,下面这篇文章主要给大家介绍了关于Java根据日期计算星期几的四种方法,文中通过代码将每种实现的非常详细,需要的朋友可以参考下方法一:根据基姆拉尔森日期公式publicstaticvoidmain(Stringargs[]){Scannerscanner=new......
  • Java的设计模式之工厂模式
    在软件设计中,我们经常遇到需要创建不同类型对象的情况,但是如果直接在代码中实例化对象,会使代码紧密耦合在一起,难以维护和拓展,此外,如果对象的创建方式需要变化,那么就需要再整个代码中进行大量的修改。工厂模式旨在解决这个问题。工厂模式提供了一个创建对象的接口,但是将具体的对象创......
  • java一体化医疗信息管理系统源码:云HIS、云病历、云LIS
    基于云计算技术的B/S架构的HIS系统,为医疗机构提供标准化的、信息化的、可共享的医疗信息管理系统,实现医患事务管理和临床诊疗管理等标准医疗管理信息系统的功能。系统利用云计算平台的技术优势,建立统一的云HIS、云病历、云LIS,有效实现实现协同门诊、住院、药房药库管理、双向转诊转......
  • Java打包镜像部署
    Java打包镜像DockerfileFROMopenjdk:17WORKDIR/opt/data-hubCOPYtarget/data-hub.jar./EXPOSE9843ENTRYPOINT["java","-jar","data-hub.jar"]构建镜像命令dockerbuild-toldweipro/data-hub:latest.运行镜像dockerrun-p9843:9843-......
  • 创建一个 java agent jar 包
    pom.xml文件。(javaagent和main方法的jar可以分开成两个项目,单独打包jar)<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"......
  • Lambda表达式
    一、简介    Lambda表达式是JDK8的一个新特性,可以取代大部分的匿名内部类,更优雅的写出代码,特别是在集合的遍历和其他集合操作中,可以极大的优化代码结构。二、接口要求    Lambda规定接口中只能有一个需要被实现的方法,不是规定接口中只能有一个方法。三、基础语......
  • javascript 手动实现 bind,call,apply
     js手动实现call方法Function.prototype.myCall=function(content,...args){letmyfn=Symbol()content=content||globalThis//console.log(content)content[myfn]=this//console.log(content)constresu......
  • Java面试题(高频、有答案,全网最强)
    这是一套全网最强的Java面试题,吊打网上所有Java面试题。此套面试题的威力:看过这套题的朋友、同事、粉丝参加了面试后说,他们面试被问到的问题大部分(85%以上)都在这套题里,面试通过率高达90%。这是粉丝的真实评价(聊天截图):有人说这套题题目太多了,我说:着急的可以看频率为两颗星及以上的题......
  • Java学习—Java修饰符
    Java语言提供了很多修饰符,主要分为以下两类:访问修饰符非访问修饰符1、访问控制修饰符Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java支持4种不同的访问权限。default (即默认,什么也不写):在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、......