Java8新特性:【二】Lambda表达式
Lambda 表达式(lambda expression),作为java8的一大亮点,它其实可以看做是一个匿名内部类。通过Lambda表达式我们可以书写出更加优雅的代码,也可以极大的优化代码结构。
Ⅰ. Lambda表达式语法
(params) -> expression
(params) -> { statements; }
()
用来描述参数列表{}
用来描述方法体->
为 lambda运算符
以下代码对Lambda表达式基础语法做一说明
package com.yunshan;
import org.junit.Test;
/**
* @Author yunshan
* @Date 2020/12/9 14:20
*/
public class LambdaDemo {
/**
* 无参数无返回值
*/
@FunctionalInterface
public interface NoParamNoReturn {
void helloLambda();
}
/**
* 一个参数无返回值
*/
@FunctionalInterface
public interface OneParamNoReturn {
void helloLambda(String param);
}
/**
* 多个参数无返回值
*/
@FunctionalInterface
public interface MoreParamNoReturn {
void helloLambda(String param1, String param2);
}
/**
* 无参有返回值
*/
@FunctionalInterface
public interface NoParamReturn {
String helloLambda();
}
/**
* 一个参数有返回值
*/
@FunctionalInterface
public interface OneParamReturn {
String helloLambda(String param);
}
/**
* 多个参数有返回值
*/
@FunctionalInterface
public interface MoreParamReturn {
String helloLambda(String param1, String param2);
}
@Test
public void test_002() {
NoParamNoReturn noParamNoReturn = () -> {
System.out.println("无参无返回");
};
OneParamNoReturn oneParamNoReturn = (String param) -> {
System.out.println("一个参数无返回值,参数为:" + param);
};
MoreParamNoReturn moreParamNoReturn = (String param1, String param2) -> {
System.out.println("多个参数无返回值,参数为:" + param1 + ":" + param2);
};
NoParamReturn noParamReturn = () -> {
return "无参数有返回值";
};
OneParamReturn oneParamReturn = (String param) -> {
return "一个参数有返回值,参数为:" + param;
};
MoreParamReturn moreParamReturn = (String param1, String param2) -> {
return "多个参数有返回值,参数为:" + param1 + ":" + param2;
};
noParamNoReturn.helloLambda();
oneParamNoReturn.helloLambda("hello");
moreParamNoReturn.helloLambda("hello", "lambda");
System.out.println(noParamReturn.helloLambda());
System.out.println(oneParamReturn.helloLambda("hello"));
System.out.println(moreParamReturn.helloLambda("hello", "lambda"));
}
}
运行结果如下:
Ⅱ. 以上两个为Lambda表达式的基本语法格式,Lambda还具有以下重要的特征
- **可选类型声明:**不需要声明参数类型,编译器可以统一识别参数值。若一个未声明,其他的都需是未声明的
- **可选的参数圆括号:**一个参数无需定义圆括号,但多个参数需要定义圆括号
- **可选的大括号:**如果主体包含了一个语句,就不需要使用大括号
- **可选的返回关键字:**如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值
以下代码对Lambda表达式重要特征做一说明
@Test
public void test_002() {
// 不需要声明参数类型,编译器可以统一识别参数值。若一个未声明,其他的都需是未声明的
OneParamNoReturn oneParamNoReturn = (param) -> {
System.out.println("一个参数无返回值,参数为:" + param);
};
MoreParamNoReturn moreParamNoReturn = (param1, param2) -> {
System.out.println("多个参数无返回值,参数为:" + param1 + ":" + param2);
};
// 一个参数无需定义圆括号,但多个参数需要定义圆括号
OneParamNoReturn oneParamNoReturn1 = param -> {
System.out.println("一个参数无返回值,参数为:" + param);
};
MoreParamNoReturn moreParamNoReturn1 = (param1, param2) -> {
System.out.println("多个参数无返回值,参数为:" + param1 + ":" + param2);
};
// 如果主体包含了一个语句,就不需要使用大括号
NoParamNoReturn noParamNoReturn = () -> System.out.println("无参数无返回值");
// 如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值
MoreParamReturn moreParamReturn = (param1, param2) -> "多个参数有返回值,参数为:" + param1 + ":" + param2;
oneParamNoReturn.helloLambda("hello");
moreParamNoReturn.helloLambda("hello", "lambda");
oneParamNoReturn1.helloLambda("hello");
moreParamNoReturn1.helloLambda("hello", "lambda");
noParamNoReturn.helloLambda();
System.out.println(moreParamReturn.helloLambda("hello", "lambda"));
}
运行结果如下:
Ⅲ. Lambda表达式基础实战
-
操作集合
- 循环打印集合
@Test public void test_001() { List<String> list = new ArrayList<>(); list.add("Java"); list.add("C++"); list.add("Python"); Map<String, String> map = new HashMap<>(); map.put("1", "Java"); map.put("2", "C++"); map.put("3", "Python"); //循环打印 list.forEach(str -> System.out.println(str)); map.forEach((k, v) -> System.out.println("key: " + k + " value: " + v)); }
运行结果如下
-
集合排序
@Test public void test_002() { List<String> list = new ArrayList<>(); list.add("A"); list.add("C"); list.add("B"); //循环打印 Collections.sort(list,(a,b)->a.compareTo(b)); list.forEach(str -> System.out.println(str)); }
运行结果如下:
其他对集合的更多操作将在Stream
当中详解
-
操作线程
@Test public void test_001() { // 普通方式创建线程 new Thread(() -> System.out.println(Thread.currentThread().getName())).start(); // 线程池创建线程 ExecutorService executor = Executors.newSingleThreadExecutor(); executor.execute(() -> System.out.println(Thread.currentThread().getName())); }
运行结果如下:
Ⅳ. Lambda表达式与IntelliJ IDEA
条件: IntelliJ IDEA 开发工具 + Maven项目
-
在POM文件中添加一个插件
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.2</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build>
-
修改全局设置
-
修改项目配置
-
使用实例:
配置完成即可对Lambda表达式提示。