java learn lambda表达式概念的引入

lambda 表达式的运用 实质是为了方便
而表达式 实质就是我们平时在码代码的时候写的式子——诸如条件语句 或者判定的语句
1、常见的方法
比如 使用增强型for循环遍历整个容器类且这个容器类泛型是——Integer 若要在其中添上if语句判定找出合乎要求的数字 就得有相应约束的式子

2、匿名类来实现
提供一个接口 之后定义一个类implements该接口

Te t=new Te() {
			  public void sf()
			  {
				  
			  }
		  };

其中 方法 sf() 就是你需要往里加入条件语句以实现代码功能
注意 方法返回的数据类型 以及return一般是你写的语句 而不是具体的一个变量 之后再把接口实例化的对象放入主要实现的另一个方法 设置参数即可

private static void filter(List<Hero> heros,Te R)
{
}

在调用以上方法的时候 可以不用传Te这个类型的参数 可以直接放表达式

3、以上两个方式都是循序渐进介绍lambda表达式
以下是lambda表达式的正确写法
代码示例——便于讲解:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Random;

public class collection_test  {
	
	public static void main(String[] args) {
		collection_test df=new collection_test();
		 Random sd=new Random();
		List<Hero> L=new ArrayList<>();
		for (int i = 0; i < 10; i++) {
			L.add(new Hero("Hero-"+i,sd.nextInt(100),sd.nextInt(100)));
		}
		System.out.println(L);
		Te t=new Te() {
			public boolean sf(Hero h)
			{
				if(h.blood<80&&h.damage<90)
				{
					return  true;
				}
				else
				{
					return false;
				}
			}
		};
		 Comparator<Hero> h=new Comparator<Hero>() {
			 public int compare(Hero o1,Hero o2)
			 {
				 if(o1.blood<o2.blood)
					 return 1;
				 else
					 return -1;
			 }
		};
		
		Collections.sort(L,h);
		System.out.println(L);
		df.seek(L, t);
		
		
	}
	public void seek(List<Hero> k,Te e)
	{
		for (Hero hero : k) {
			if(e.sf(hero))
			{
			System.out.println(hero);
			}
		}
	}

}

Hero类

public class Hero{
	public  String name;
	public int blood;
	public int damage;


	public Hero() {
		
	}
	public Hero(String name,int blood,int damage)
	{
		this.name=name;
		this.blood=blood;
		this.damage=damage;
	}
	
	public String toString()
	{
		return name+"-"+blood+"-"+damage;
	}
	
}

强调 注意:
再则之前 对于Hero类中的toString() 方法的重写 是注意到了 但是这次才真正的清楚 toString这个方法的 return语句的作用——它所返回的是实例化对象后需要输出的数据 通过‘+’ 连接每一个字符串以达到目的。因此之后的toString不只是对于String类型的数据的返回 而是这个类里的属性都可以随之一并输出,所以才为什么要注意对应输出需求重写toString

lambda表达式讲解:
代码中的语句——h.blood<80&&h.damage<90 才是真正所需要的表达式
只是实现的方式有多种
正确的lambda 表达式为:h->h.blood<80&&h.damage<90
所以也可以不用如示例代码中那样写一个匿名类 将其引用作为参数放入seek方法里——seek(L,h->h.blood<80&&h.damage<90) 即可
可以结合普通方法来理解——

for (Hero hero : k) {
			if(hero.blood<80&&hero.damage<90)
			{
			System.out.println(hero);
			}
		}

注意 h->h.blood<80&&h.damage<90 式子中的h也是变量不要和其他变量重复
-> 则是lambda表达式的特征 变量加-> 后跟其语句
也有多个参数(h,e)->… 前面的参数和后面的是同一类型

得出lambda表达式是建立在原有匿名类的基础上 且->之后的语句正是匿名类方法里的整段代码的缩写 比如条件语句的三元表达式简写
可以得出 匿名类里的内容一般不多 有的只是为了实现某个方法的一小部分功能而设立的。当然也有多的 使得lambda表达式也随之增加 但是量总比匿名类中的少 不然就没有意义。

从匿名类写法来实现 压缩成 lambda表达式 可以看出实质还是在调用自定义接口的方法 只是把该方法里的条件语句直接写出来罢了
因此 得出lambda表达式也是一种匿名方法,直接将匿名方法作为参数进行传递也是一种编程思想 如同之前的空间换时间

关于eclipse不能正常识别lambda表达式的解决措施:
菜单->Window->Preferences->Java-Compiler->Compiler compliance leve: 设置为1.8即可
但是现在JDK版本都挺高的 应该不会存在 因此Java会将该匿名方法转变为匿名类方式 简洁代码。

对于lambda表达式 简短代码尤其是匿名类中语句不多且便于简写成lambda表达式 可以适用 面对企业级项目庞大复杂代码量 慎用 因为可读性差 难以调试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值