lambda表达式,增强for,collection工具,可变参

本文深入探讨了Java中Lambda表达式的定义、语法和使用场景,包括作为参数传递、方法引用、构造器引用以及在多线程、排序和动态代理中的应用。同时,介绍了增强for循环和collection工具类的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.lambda

1.定义:

lambda表达式就是简单的匿名内部类,实现接口中只能有一个抽象方法,可以有多个其他方法。

2.特点:

Lambda表达式只能为函数式接口创建实例(即只能有一个抽象方法)
Lambda表达式的代码块不允许调用接口中的默认(default)方法

3.基本语法:

(参数)->表达式 或 (参数)->{方法体;}

4.例子

1.基本
interface InterA{
	public void showA();
}
interface InterB{
	public void showB(int a);
}
interface InterC{
	public void showC(int a,int b);
}
interface InterD{
	public int showD(int a,int b);
}
@FunctionalInterface
interface InterE{
	public int showD(int a,int b)
}

在main方法中
          //1.无参的
		InterA aa = ()->System.out.println("没有参数");
		aa.showA();
		//2.一个参数的
		InterB bb = (ib)->System.out.println("一个参数:"+ib);
		bb.showB(5);
		//3.两个参数的
		InterC cc = (ia,ib)->System.out.println("两个参数:"+" ia:"+ia+"   ib:"+ib);
		cc.showC(4, 5);
		//4.返回值
		InterD dd = (i,j)->i+j;
		int value1 = dd.showD(4, 7);
		System.out.println(value1);
		
	//5.lambda表达式作为参数
	fun2(
			new InterC() {public void showC(int a, int b) {}}
		);
	fun2((i,j)->System.out.println("lambda表达式作为参数"+" i:"+i));
	
	//7.lambda表达式中变量的使用(和匿名内部类差不多)
	String value11 = "hello world";
	InterA aaa = ()->{
		System.out.println(value11);
		//value11是final类型的是一个常量,值是不能改变的
		//value11 = "haha";	};
	aaa.showA();
2.引用方法或构造
//* 1.引用类方法
interface Converter{
	//将字符串转换成整数
	Integer convert(String value);
}
class Test1{
	public static void fun1() {
		//原来的方法
		Converter converter = value->Integer.valueOf(value);
		Integer v1 = converter.convert("222");
	//简化
	//引用类方法
	//通过::实现,这里会自动将lambda表达式方法的参数全部传递给当前的方法
	Converter converter2 = Integer::valueOf;
	Integer v2 = converter2.convert("333");
	System.out.println(v2);
}

}
//* 2.引用特定对象的实例方法
interface IA{
	public void show(String message);
}
class A{
	public void play(String i) {
		System.out.println("这里是A的方法play"+"  i:"+i);
	}
}
class Test2{
	public static void fun2() {
		//原来
		IA ia = message->new A().play(message);
		ia.show("hello");
		//简化
		IA ia2 = new A()::play;
		ia2.show("world");
	}
}
//* 3.引用某类对象的实例方法
interface IB{
	String subString(String string,int stat,int end);
}
class Test3{
	public static void fun3() {
		//原来
		IB ib = (string,stat,end)->string.substring(stat, end);
		String sub1 = ib.subString("hello world", 2, 4);
		System.out.println(sub1);
		//简化
		 //函数式接口中被实现方法的第一个参数作为调用者,后面的参数全部传递给该方法
		IB ib2 = String::substring;
		String sub2 = ib2.subString("class is over", 2, 5);
		System.out.println(sub2);
	}
}
//* 4.引用构造方法
interface IC{
	Object show(String name,int age);
}
class Person{
	String name;
	int age;
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}

}
class Test4{
	public static void fun4() {
		IC ic = (name,age)->new Person(name, age);
		Object per = ic.show("bing", 19);
		System.out.println(per);
		

	//简化 
	//构造方法引用代替lambda表达式,函数式接口中被实现方法的全部参数传该构造方法作为参数
	IC ic2 = Person::new;
	Object per1 = ic2.show("chen", 10);
	System.out.println(per1);
}

}
3.实际使用
//多线程
		new Thread(new Runnable() {
			public void run() {
				System.out.println("通过匿名内部类创建任务");
			}
		}).start();
		//通过lambda表达式
		new Thread(()->System.out.println("通过lambda表达式创建任务")).start();
		//排序--使用Collections
//		Collections.sort(list, new Comparator<String>() {
//			public int compare(String o1, String o2) {
//				return o1.compareTo(o2);
//			}
//		});
		

```
	//使用lambda表达式
	Collections.sort(list, (o1,o2)->o1.compareTo(o2));
	System.out.println(list);
	
	//动态代理
	Inter inter = new DaHuang();
	Proxy.newProxyInstance(inter.getClass().getClassLoader(), new Class[] {Inter.class}, new InvocationHandler() {
		
		@Override
		public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
			System.out.println("洗手");
			Object object = method.invoke(inter, args);
			return object;
		}
	});
	//lambda表达式
	Proxy.newProxyInstance(inter.getClass().getClassLoader(), new Class[] {Inter.class},(proxy,method,arg)->{
		System.out.println("洗手");
		Object object = method.invoke(inter, arg);
		return object;
	});
```


2.增强for

1.例子

List<String>  list;

for (String string : list) {
			System.out.println(string);
		}

3.collection工具类

//使用Collections排序
		//第一种排序:默认按照字典进行排序
		//注意:要想list中的元素可以按照字典排序,元素必须实现Comparable接口
		Collections.sort(list);
		
	//按照从短到长排序
	//使用比较器
	ComStrWithLength1 comStrWithLength = new ComStrWithLength1();
	Collections.sort(list, comStrWithLength);
	
	//倒叙字典排序
	Collections.reverse(list);
	
	//求最大值
	String max = Collections.max(list, comStrWithLength);

4.可变参

//1.构成:数据类型+...    实际上就是数据类型[]  即:int[]
	public static int sum1(int... a) {
		int sum = 0;
		for (int i = 0; i < a.length; i++) {
			sum+=a[i];
		}
		return sum;
	}

//2.当包括可变参数在内有多个参数时,可变参数必须放在最后面,并且一个方法中最多只能有一个可变参数
	public static int sum2(float b,int... a) {
		int sum = 0;
		for (int i = 0; i < a.length; i++) {
			sum+=a[i];
		}
		return sum;
	}
	//3.当可变参数的方法与固定参数的方法是重载关系时,调用的顺序,固定参数的优先于可变参数的.
	public static int sum3(int a, int b) {
		System.out.println("a");
		int sum = 0;
		return sum;
	}
	public static int sum3(int... a) {
		System.out.println("b");
		int sum = 0;
		return sum;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值