java 8新特性1 lambda表达式、函数式接口

本文详细介绍了Java8的重要更新,包括Lambda表达式的引入及其简洁的语法特性,如何使用Lambda表达式替代匿名内部类,以及函数式接口的概念。此外,还探讨了四种常见的函数式接口:Consumer、Supplier、Function和Predicate,并通过具体示例展示了这些接口的实际应用。

在这里插入图片描述

  Oracle公司于2014年3月18日发布 Java8 。
  支持Lambda表达式。
  函数式接口。
  新的Stream API。
  新的日期 API。

  Lambda 表达式,特殊的匿名内部类,语法更简洁。Lambda 表达式允许把函数作为一个方法的参数,将代码像数据一样传递。

  Runnable 匿名内部类写成 Lambda 形式。


public class Test1 {
	public static void main(String[] args) {
		
		//匿名内部类:
		Thread thread = new Thread(new Runnable() {
			
			@Override
			public void run() {
				System.out.println("子线程1...");
			}
		});
		thread.start();
		
		//lambda表达式:
		Thread thread2 = new Thread(()->System.out.println("子线程2...."));
		thread2.start();
	}
}

  Lambda 表达式注意事项。
  形参列表的数据类型会自动推断。
  如果形参列表为空,只需保留() 。
  如果形参只有1个,()可以省略,只需要参数的名称即可。
  如果执行语句只有一句,且无返回值,{}可以省略,若有返回值,则若想省去{},则必须同时省略return,且执行语句也保证只有一句。
  Lambda不会生成一个单独的内部类文件。

  函数式接口。如果一个接口只有一个抽象方法,则该接口称之为函数式接口,函数式接口可以使用Lambda表达式,Lambda表达式会被匹配到这个抽象方法上 。@FunctionalInterface 注解检测接口是否符合函数式接口。

  自定义函数式接口写成 Lambda 形式。


//定义函数式接口,里面只允许一个抽象方法
@FunctionalInterface  
interface USB{
	public void connect();
}

public class Test2 {
	public static void main(String[] args) {
		
		//匿名内部类:
		USB usb = new USB() {
			
			@Override
			public void connect() {
				System.out.println("匿名内部类的执行...");
			}
		};
		usb.connect();
		
		//lambda表达式
		USB usb2 = ()->System.out.println("9999...");
		usb2.connect();
	}
}

  常见函数式接口。
  Consumer ,消费型接口。void accept(T t);对类型为T的对象应用操作。
  Supplier,供给型接口。T get(); 返回类型为T的对象。
  Function<T,R>,函数型接口。R apply(T t);对类型为T的对象应用操作,并返回类型为R类型的对象。
  Predicate,断言型接口。boolean test(T t);确定类型为T的对象是否满足条件,并返回boolean类型。


public class Test1 {
	public static void main(String[] args) {
		Consumer<Integer> con = new Consumer<Integer>() {

			@Override
			public void accept(Integer t) {
				System.out.println("获取消费金额:"+t);
			}
		};
		con.accept(100000);
		
		//lambda表达式
		//消费型接口: 有参数,无返回值
		Consumer<Integer> con2 = s->System.out.println("获取消费金额:"+s);
		con2.accept(9999);
		
		//供给型接口:无参数,有返回值
		Supplier<Integer> sup = ()->new Random().nextInt(9);  //获取随机值0-8
		System.out.println(sup.get());
		
		//函数型接口: 有参数,有返回值
		Function<String, String> fun = s->s.toUpperCase();
		System.out.println(fun.apply("abcde"));
		
		//断言型接口:有参数,返回值为boolean
		Predicate<Integer> pro = s->s>0;
		System.out.println(pro.test(1));
		
	}
}

  函数式接口的应用案例。将断言型接口做为方法参数做字符串过滤的判断。


public class Test1 {

	public Test1() {
		
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		List<String> list = new ArrayList<String>();

		list.add("lisi1");
		list.add("lisi2");
		list.add("zhangsan1");
		list.add("zhangsan2");
		list.add("wangwu1");
		
		// 普通方法
		System.out.println(filer1(list));
		System.out.println(filer2(list));
		
		// 函数式接口做为方法参数,一个方法可实现多个判断方式
		System.out.println(filerLambda(list, s -> s.length() > 5));
		System.out.println(filerLambda(list, s -> s.startsWith("w")));
	}
	
	// Predicate 断言型接口,传入 lambda 表达式后,
	// pre.test(string) 替换成 string.length() > 5
	public static List<String> filerLambda (List<String> list, Predicate<String> pre) {
		
		List<String> list1 = new ArrayList<String>();
		
		for (String string : list) {
			if (pre.test(string)) {
				list1.add(string);
			}
		}
		
		return list1;
		
	}
	
	
	public static List<String> filer1 (List<String> list) {
		
		List<String> list1 = new ArrayList<String>();
		
		for (String string : list) {
			if (string.length() > 5) {
				list1.add(string);
			}
		}
		
		return list1;
		
	}
	
	public static List<String> filer2 (List<String> list) {
		
		List<String> list1 = new ArrayList<String>();
		
		for (String string : list) {
			if (string.startsWith("w")) {
				list1.add(string);
			}
		}
		
		return list1;	
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值