合集-闭包、java8、重写equals、

2021/6/28 20:25:38

本文主要是介绍合集-闭包、java8、重写equals、,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

文章目录

  • 1 lambda表达式(闭包)
    • 1.1 概念及优势
    • 1.2 语法
    • 1.3 特性
    • 1.4 实例
  • 2 java8的新特性
    • 2.1 函数式接口
    • 2.2 Lambda 表达式
    • 2.3 方法引用
    • 2.4 Stream API
    • 2.5 Date Time API
    • 2.6 Optional 类
  • 3 为什么重写equals和重写hashcode?

1 lambda表达式(闭包)

1.1 概念及优势

  • Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
  • Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
  • 使用 Lambda 表达式可以使代码变的更加简洁紧凑。

1.2 语法

  • (parameters) -> expression

  • (parameters) ->{ statements; }

1.3 特性

  1. 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
  2. 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
  3. 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
  4. 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。

1.4 实例

// 1. 不需要参数,返回值为 5  
() -> 5  
  
// 2. 接收一个参数(数字类型),返回其2倍的值  
x -> 2 * x  
  
// 3. 接受2个参数(数字),并返回他们的差值  
(x, y) -> x – y  
  
// 4. 接收2个int型整数,返回他们的和  
(int x, int y) -> x + y  
  
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)  
(String s) -> System.out.print(s)
public class Demo1 {
	public static void main(String[] args) {
		runThreadByLambda();
		runThreadByInnerClass();
	}

	public static void runThreadByLambda() {
		/*
		 Runnable就是一个函数式接口:他只有一个方法run()方法。
		 1、因为run()方法没有参数,所以   ->前面的()中不需要声明形参
		 2、run返回的是void,所以不需要return。
		 3、->后面写的代码其实就是定义在run方法内的代码。因为此处代码只有一行,所以{}也可以省略。如果此处多与一行,则无法省略。
		 */
		Runnable runnable = () -> System.out.println("这个是用拉姆达实现的线程");
		new Thread(runnable).start();
	}

	public static void runThreadByInnerClass() {
		Runnable runnable = new Runnable() {

			@Override
			public void run() {
				System.out.println("这个是用内部类实现的线程");

			}
		};
		new Thread(runnable).start();
	}
}

2 java8的新特性

2.1 函数式接口

  • 函数式接口是只包含一个方法的接口。
  • 比如Java标准库中的java.lang.Runnable和 java.util.Comparator都是典型的函数式接口。
  • java 8提供 @FunctionalInterface作为注解。

2.2 Lambda 表达式

Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)。

2.3 方法引用

lambda表达式的一种简化写法。
所引用的方法其实是lambda表达式的方法体实现,语法也很简单,左边是容器(可以是类名,实例名),中间是"::",右边是相应的方法名。

2.4 Stream API

新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。

2.5 Date Time API

加强对日期与时间的处理。

2.6 Optional 类

  • Optional类的Javadoc描述如下:这是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
  • Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。

3 为什么重写equals和重写hashcode?

  • HashMap中,如果要比较key是否相同,要同时使用这两个方法。
  • 因为自定义的类的hashcode()方法继承于Object类,其hashcode码为默认的内存地址,这样即便有相同含义的两个对象,比较也是不相等的。
  • HashMap中的比较key是这样的,先求出key的hashcode(),比较其值是否相等,若相等再比较equals(),若相等则认为他们是相等的。若equals()不相等则认为他们不相等。
  • 如果只重写hashcode()不重写equals()方法,当比较equals()时只是看他们是否为同一对象(即进行内存地址的比较),所以必定要两个方法一起重写。
  • HashMap用来判断key是否相等的方法,其实是调用了HashSet判断加入元素是否相等。重载hashCode()是为了对同一个key,能得到相同的Hash Code,这样HashMap就可以定位到我们指定的key上。重载equals()是为了向HashMap表明当前对象和key上所保存的对象是相等的,这样我们才真正地获得了这个key所对应的这个键值对。


这篇关于合集-闭包、java8、重写equals、的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程