Java——Lambda

Java——Lambda

1.8的新特性:

  • Lambda表达式
  • 为了简化匿名内部类的
  • 使用前提:
  • 函数式接口: 必须要重写的抽象方法只有一个的接口
  • 检测一个 接口是否为函数式接口: @FunctionalInterface
  • 语法: ()->{};
  • () 方法的参数列表
  • {} 重写抽象方法的方法体
  • -> 箭头符号 lmabda符号
public class LambdaDemo01 {
	public static void main(String[] args) {
		//匿名 内部类 
		/*
		 * Smoke s = new Smoke() {
		 * 
		 * @Override public void Smoking() {
		 * 
		 * } };
		 */
		//Lambda写法 1
		/*
		 * Smoke s1 = ()->{ System.out.println("边吸烟边吐烟圈 ..."); };
		 */
		
		//Lambda写法 2 如果方法体只有一句,前后的{}可以省略
		/* Smoke s2 = ()->System.out.println("边吸烟边吐烟圈 2..."); */
		
		//Lambda写法3 如果抽象方法有参数,参数的数据类型可以省略
		/* Smoke s3 = (a)->System.out.println("边吸烟边吐烟圈 3..."+a); */
		
		//Lambda写法4 如果参数只有一个,前后的()可以省略
		/* Smoke s4 = a->System.out.println("边吸烟边吐烟圈 4..."+a); */
		
		//Lambda写法5 如果方法体语句只有一句,并且是return返回值语句,前后的{}与return关键字可以一起省略
		Smoke s5  = i-> "最后"+i;
		System.out.println(s5.Smoking(3));
	}
}

@FunctionalInterface
interface Smoke{
	String Smoking(int a);
}

题一:调用Arrays.sort()方法,通过定值排序比较两个Employee(先按年龄比,年龄相同按姓名比),使用Lambda作为参数传递
分析:
1.定制排序:指自定义比较器|定制排序
自然排序:内部比较器|自然排序
2.先比较年龄,年龄相同才比较姓名

import java.util.Arrays;

import com.shsxt.bean.Employee;

public class TestLambda01 {
	public static void main(String[] args) {
		Employee[] arr= {new Employee("姜首航",18),new Employee("姜云英",17),new Employee("姜子牙",18)};
		
		System.out.println(Arrays.deepToString(arr));
		
		//定制排序  比较年龄,年龄相同才比较姓名
		Arrays.sort(arr,(Employee e1,Employee e2)->{
			if(e1.getAge() == e2.getAge()) {
				return e1.getName().compareTo(e2.getName());
			}
			return e1.getAge() - e2.getAge();
		});
		
		System.out.println(Arrays.deepToString(arr));
		
		System.out.println((int)'子');
		System.out.println((int)'首');
	}
}

习题二:

  • 1)声明函数式接口,接口中声明抽象方法,public String getValue(String str)
  • 2)声明类 TestLambda,类中编写方法使用接口作为参数,讲一个字符串转成大写,并作为方法的返回值 toUpperCase
  • 3)再将一个字符串的第2个和第4个索引位置进行截取子串 subString()
public class TestLambda02 {
	public static void main(String[] args) {
		String upper = strHandler("haha", (str)->{return str.toUpperCase();});
		System.out.println(upper);
		
		String trim = strHandler("  因为所以,科学道理  ", (str)->str.trim());
		System.out.println(trim);
	}
	
	//工能的封装: 操作字符串
	//参数: 字符串String,操作方式MyFunction   返回值:结果字符串String
	public static String strHandler(String str,MyFunction fun) {
		return fun.getValue(str);
	}
}

@FunctionalInterface
interface MyFunction{
	public String getValue(String str);
}

习题三:

  • 1)声明一个带两个泛型的函数式接口,发型类型为<T,R> T为参数,R为返回值
  • 2)接口中声明对应抽象方法
  • 3)在TestLambda类中声明方法,参数三个,两个long类型的参数,接口作为参数,接口实现中计算两个long型参数的和
  • 4)再计算两个long型参数的乘积
public class TestLambda03 {
	public static void main(String[] args) {
		op(10L, 20L, (x,y)->x+y);
		op(10L, 20L, (x,y)->x*y);
	}
	//对两个lang类型参数进行某种操作 .结果打印   long->包装类->Long
	public static void op(Long l1,Long l2,Function2<Long,Long> my) {
		System.out.println(my.getValue(l1, l2));
	}
}
//T为参数,R为返回值
interface Function2<T,R>{
	public R getValue(T  t1,T t2);
}

下一篇,String类

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值