Java8特性

Java8特性

Java8特性:

  1. Lambda表达式
  2. 方法引用
  3. 函数式接口
  4. 默认方法
  5. stream流

Lambda表达式

Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性,它允许将函数作为方法的参数传递到方法中,使得代码更加简洁,紧凑。

* 注意
  • lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有 final 的语义)
	public static void main(String[] args) {
		String salutation = "Hello!";
		Java8Test java8Test = message -> System.out.println(salutation + message);
		java8Test.test("roj");
		// 报错信息:Local variable salutation defined in an enclosing scope must be final or effectively final
		// 不允许修改
		salutation = "world";
	}
	
	interface Java8Test{
		void test(String message);
	}
  • 在lambda表达式中不允许申明一个与局部变量同名的参数或者局部变量
public static void main(String[] args) {
		String salutation = "Hello!";
		// salutation 与局部变量重名
		Java8Test java8Test = salutation -> System.out.println(salutation + salutation);
		java8Test.test("roj");
	}
	
	interface Java8Test{
		void test(String message);
	}

方法引用

我们可以通过方法的名称来指向需要引用的方法,使语言更简洁,不冗余。
方法引用使用一对::

// 调用构造器::new
Car car = Car.create(Car::new);
List<Car> cars = Arrays.asList(car);
// 调用静态方法,非静态方法::方法名
cars.forEach(Car::collide);

函数式接口

函数式接口指有且仅有一个抽象方法,但是可以有多个非抽象方法的接口,在接口上方用@FunctionalInterface注解声明
java8提供的函数式接口

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

默认方法

接口可以有实现方法,而且不需要实现类去实现这个方法。我们只需要在方法名称之前加一个default关键字即可

* 为什么要有这个特性?

首先,之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类,目前的 java 8 之前的集合框架没有 foreach 方法,通常能想到的解决办法是在JDK里给相关的接口添加新的方法及实现。然而,对于已经发布的版本,是没法在给接口添加新方法的同时不影响已有的实现。所以引进的默认方法。他们的目的是为了解决接口的修改与现有的实现不兼容的问题。

interface DefaultTest2{
	default void println() {
		System.out.println("这是一个默认方法2");
	}
}

interface DefaultTest1{
	default void println() {
		System.out.println("这是一个默认方法1");
	}
}

class Tester implements DefaultTest2, DefaultTest1{

	@Override
	public void println() {
		DefaultTest1.super.println();
		DefaultTest2.super.println();
		System.out.println("这是一个默认方法3");
	}

}

Stream流

Stream(流)是一个来自数据源的元素队列并支持聚合操作。元素是特定类型的对象,形成一个队列。流的来源可以是集合,数组,I/O channel, 产生器generator 等

* 流的方法
  • forEach()。用来迭代循环
List<Integer> numbers = Arrays.asList(1,7,3,2,6,2,5);
numbers.stream().forEach(System.out::println);
  • map()。用于映射每个元素对应的结果
// 获取numbers数组元素的平方
List<Integer> numbers = numbers.stream().map(t -> t*t).collect(Collectors.toList());
  • filter()。用于通过设置条件筛选出需要的数据
numbers.stream().filter(t -> t>4).forEach(System.out::println);
  • limit()。用于获取指定数量的流
Random random = new Random();
random.ints().limit(2).forEach(System.out::println);
  • sorted()。用于对流进行排序
// 比较对象时可以使用Comparator比较器
// 倒叙
numbers.stream().sorted(Comparator.reverseOrder()).forEach(System.out::println);
// 正序
numbers.stream().sorted().forEach(System.out::println);
  • Collectors()。规约操作,将流转换成集合和聚合函数,可以用于返回集合或者字符串
List<Integer> squaresList = numbers.stream().map(t -> t*t).sorted(Comparator.reverseOrder()).collect(Collectors.toList());
  • parallelStream 流,是流并行处理程序的代替方法
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 获取空字符串的数量
long count = strings.parallelStream().filter(string -> string.isEmpty()).count();

其他特性

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值