Java-Lambda表达式

Posted ZSYL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java-Lambda表达式相关的知识,希望对你有一定的参考价值。

定义

把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。

  • 匿名——我们说匿名,是因为它不像普通的方法那样有一个明确的名称:写得少而想得多。
  • 函数——我们说它是函数,是因为Lambda函数不像方法那样属于某个特定的类。但和方法一样,Lambda有参数列表、函数主体、返回类型,还可能有可以抛出的异常列表。
  • 传递——Lambda表达式可以作为参数传递给方法或存储在变量中。
  • 简洁——无需像匿名类那样写很多模板代码。

组成

参数列表——功能中需要的内容,如
箭头——箭头 -> 把参数列表与Lambda主体分隔开
Lambda主体——功能。表达式就是Lambda的返回值

应用

示例1

在竞赛中,很多时候需要用到**Arrays.sort()**进行排序,而有时需要自定义排序类型,重写比较器Comparator

如:按照年龄升序排序

// 首先定义Person类,属性int age
// 定义一个Person数组
Person persons = {new Person("帅",30),
				new Person("柳",21),
				new Person("娜",20)
		};

// 按照年龄进行升序排序,使用比较器
Arrays.sort(persons, new Comparator<Person>(){
	@Override
	public int compare(Person o1, Person o2) {
		return o1.getAge() - o2.getAge();
	}
});

// 简化,编译器知道是哪个方法被重写,可以将方法头,全省去,只剩下return
Arrays.sort(persons, (Person o1, Person o2) -> {
		return o1.getAge() - o2.getAge();
	});
	
// 更加简化,编译器知道参数的类型,因此省去类型,去掉大括号和return(二者成对去除)
Arrays.sort(persons, (o1, o2) -> o1.getAge() - o2.getAge());

另外在PriorityQueue(优先队列),中默认元素是升序排序,如果元素类型是自定义类型的对象时,可以重写比较器,修改排序类型。

示例2

  • 函数式接口函数式接口就是只定义一个抽象方法的接口
    下面三个接口都是函数式接口:
@FunctionalInterface
public interface Comparator<T> {
	int compare(T o1, T o2);
}

@FunctionalInterface
public interface Callable<V>{
	V call();
}

public interface PrivilegedAction<T> {
	T run();
}

Lambda表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例(具体说来,是函数式接口一个具体实现的实例)。

public class Lambda {
	public static void main(String[] args) {
		// 创建Runnale接口的实现类,重写Run方法即设置线程任务
		// 创建Thread类对象,将实现类对象作为参数传进去,使用start方法,开始run方法
		new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println(Thread.currentThread().getName());
			}
		}).start();
		
		// lambda表达解决冗余问题
		new Thread(()->{
			System.out.println(Thread.currentThread().getName());
		}
		).start();
	}
}

// 使用StartThread方法,参数使用匿名内部类
startThread(new Runnable() {
	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName()+"开启线程");
	}
});

// lambda优化,
startThread(()->System.out.println(Thread.currentThread().getName()+"开启线程"));

Java小白的我,只是初步了解lambda表达式,内容欠缺,抱歉
努力。
加油!!!

以上是关于Java-Lambda表达式的主要内容,如果未能解决你的问题,请参考以下文章

Java-lambda表达式入门看这一篇就够了

Java-Lambda表达式

如何理解这段代码片段中的两对括号?

通过 Java 正则表达式提取 semver 版本字符串的片段

4.3 合并重复的条件执行片段

在 intellij 上调试评估表达式