java8 新特性

Java 8新特性简介

  • 速度更快 (红黑树)
  • 代码更少(增加了新的语法:Lambda 表达式)
  • 强大的 Stream API
  • 便于并行
  • 最大化减少空指针异常:Optional
  • Nashorn引擎,允许在JVM上运行JS应用

一、Lambda表达式

Lambda 是一个匿名接口的实例,我们可以把 Lambda 表达式理解为是一段可以 传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更 灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了 提升。

表达式的使用:

示例:(o1.o2)->Integer.compare(o1,o2)

lambda操作符或箭头操作符 ->

操作符左边:lambda形参列表(其实就是接口中的抽象方法的形参列表)

操作符右边:lambda体(其实就是重写的抽象方法的方法体)

使用情况分为6种:

1.1 格式一:无参,无返回值
@Test
	public void test1() {
   
		
		Runnable r1 = new Runnable() {
   
			
			@Override
			public void run() {
   
				System.out.println("我爱北京天安门");
				
			}
		};
		
		r1.run();
		System.out.println("*****************");
		Runnable r2 = ()->System.out.println("我爱北京天安门");
		r1.run();
		
	}
1.2 格式二:Lambda 需要一个参数,但是没有返回值
@Test
	public void test2() {
   
		Consumer<String> con = new Consumer<String>() {
   

			@Override
			public void accept(String t) {
   
				System.out.println(t);
				
			}
			
		};
		con.accept("谎言和誓言的区别是什么?");
		
		Consumer<String> con1 = (String s)->System.out.println(s);
		
		con1.accept("啦啦啦啦");
	}
1.3 格式三:数据类型可以省略,因为可由编译器推断得出,称为“类型推断”
@Test
	public void test3() {
   
		ArrayList<String> list = new ArrayList<>();//类型判断
		int[] arr = {
   1,2,3};
		
		Consumer<String> con = new Consumer<String>() {
   

			@Override
			public void accept(String t) {
   
				System.out.println(t);
				
			}
			
		};
		con.accept("谎言和誓言的区别是什么?");
		
		Consumer<String> con1 = (s)->System.out.println(s);
		
		con1.accept("啦啦啦啦");
	}
1.4 格式四:Lambda 若只需要一个参数时,参数的小括号可以省略
	@Test
	public void test4() {
   

		ArrayList<String> list = new ArrayList<>();// 类型判断
		int[] arr = {
    1, 2, 3 };

		Consumer<String> con = new Consumer<String>() {
   

			@Override
			public void accept(String t) {
   
				System.out.println(t);

			}

		};
		con.accept("谎言和誓言的区别是什么?");

		Consumer<String> con1 = s -> System.out.println(s);

		con1.accept("啦啦啦啦");
	}

1.5 格式五:Lambda 需要两个或以上的参数,多条执行语句,并且可以有返回值
@Test
	public void test5() {
   
		Comparator<Integer> com1 = new Comparator<Integer>() {
   

			@Override
			public int compare(Integer o1, Integer o2) {
   
				System.out.println(o1);
				System.out.println(o2);
				return o1.compareTo(o2);
				
			}
		};
		System.out.println(com1.compare(12, 21));
		
		
		System.out.println("****************");
		
		
		Comparator<Integer> com2 = (o1,o2)->{
   
			System.out.println(o1);
			System.out.println(o2);
			return o1.compareTo(o2);
		};
		System.out.println(com2.compare(12, 21));
	}
1.6 格式六:当 Lambda 体只有一条语句时,return 与大括号若有,都可以省略
@Test
	public void test6() {
   
		Comparator<Integer> com1 = new Comparator<Integer>() {
   

			@Override
			public int compare(Integer o1, Integer o2) {
   
				return o1.compareTo(o2);				
			}
		};
		System.out.println(com1.compare(12, 21));
		
		Comparator<Integer> com2 = (o1,o2)->  o1.compareTo(o2);
		System.out.println(com2.compare(21, 12));
	}

总结:

->左边:lambda形参列表的参数类型可以省略(类型推断),吐过lambda形参列表只有一个参数,其()可以省略

->右边:lambda体应该用一对{}包裹,如果lambda体只有一条执行语句(可能是return语句),省略这一对{}和return

lambda表达式本质上就是:函数式接口的实例,以前用匿名实现类表示的现在都可以用lambda表达式来写

二、函数式(Functional)接口

如果一个接口中,只声明了一个抽象方法,则此接口就称为函数式接口

在这里插入图片描述

何时使用给定的函数式接口?

如果开发中需要定义一个接口,首先看看在已有的jdk提供的函数式接口是否提供了能满足需求的函数式接口。如果有,则直接调用即可,不需要自己再自定义了。

consumer接口

public class lambdaTest2 {
   
	@Test
	public void test1() {
   
		happyTime(500, new Consumer<Double>() {
   

			@Override
			public void accept(Double t) {
   
				System.out.println("学习太累了,给点钱花花" + t);

			}
		});
		System.out.println("************");
		happyTime(400,money->System.out.println("学习太累了,给点钱花花"+money));
	}

	public void happyTime(double money, Consumer<Double> con) {
   
		con.accept(money);
	}

}

Predicate接口

@Test
	public void test2() {
   
		java.util.List<String> list = Arrays.asList("北京", "南京", "天津", "东京", "西京", "普京");
		List<String
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值