Java 8 新特性 Ⅰ

lambda 表达式

匿名函数, 可以理解为一段可以传递的代码

转换的规则: 删去能够确定(or可以通过推断得出)的东西(例: 只有一个函数, 那么不需要写函数名)

实质:

  • 一方面, lambda 表达式作为接口的实现类的对象

  • 一方面, lambda 表达式为匿名函数

(万物皆对象)

```java

/**

* lambda 表达式的使用

* (x, x) -> xx

* -> : lambda操作数 or 箭头操作符

* ->的左边是lambda的形参列表, 对应要重写接口仲的抽象方法的形参列表

* ->的右边是lambda体, 对应接口实现类要重写的方法的方法体

*/

// 当只有一个方法时, 才不需要写方法名. 不然分不清使用哪一个方法

```

  1. 无参, 无返回值

```java

@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("广州"); // 去掉确定的信息

r2.run(); // 调用线程

}

```

运行结果:

!1.运行结果(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/06ceb809d5e84a63877c7f8f232f4ea8\~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=372\&h=115\&s=4513\&e=png\&b=272935)

  1. 1个形参, 没有返回值

```java

@Test

public void test2(){

Comparator<Integer> com1 = new Comparator<Integer>() { // 匿名实现类

@Override

public int compare(Integer o1, Integer o2) {

return Integer.compare(o1, o2);

}

};

int compare1 = com1.compare(1,3); // 比较对象大小

System.out.println(compare1); // 前一个数小 -> -1

System.out.println("====================");

// 只有一个方法 不需要写方法名(省略确定的东西, 如 Integer, @override ...)

Comparator<Integer> com2 = (o1, o2) -> Integer.compare(o1, o2); // lambda 表达式

int compare2 = com2.compare(5,3); // 比较对象大小

System.out.println(compare2); // 后一个数小 -> 1

}

```

运行效果:

!2.运行结果(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1f46645e51d246df945a01d8941c821b\~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=306\&h=98\&s=4231\&e=png\&b=282a36)

  1. 数据类型可以省略, 由编译器推断得出, 称为"类型判断"

```java

@Test

public void test03(){

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

@Override

public void accept(String s) {

System.out.println("hey man nice to meet you "+s);

}

};

con1.accept("none"); // 调用方法

Consumer<String> con2 = (String s) -> {

System.out.println(s);

};

con2.accept("nice to meet you, bro");

Consumer<String> con3 = (s) -> { // 类型可以被推断(泛型, 数组..) 所以可以不用写

// 当然这里可以运用方法引用 System.out::println;

System.out.println(s);

};

con3.accept("nice to meet you");

}

```

运行效果:

!3.运行效果(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5bfc14d6472c44cebcfddc7c41881f65\~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=354\&h=106\&s=7311\&e=png\&b=282a36)

  1. 若函数需要一个参数时, 其小括号可以省略

  2. lambda需要≥2个参数, 执行多条语句, 并且可以有返回值

```java

@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,22)); // 前面小 会输出 -1

System.out.println("=========================");

Comparator<Integer> com2 = (o1, o2)-> { // {} 为lambda体

System.out.println(o1);

System.out.println(o2);

return o1.compareTo(o2);

};

System.out.println(com2.compare(22,11)); // 方法调用, 后面小, 会输出 1

}

```

运行效果:

!5.输出结果(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/09b8876f273241c7bb3b9875fce41bfd\~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=365\&h=211\&s=5987\&e=png\&b=282a36)

  1. lambda体只有一条语句时, return 与 {} 若有, 可以省略

```java

@Test

public void test6(){

Comparator<Integer> com1 = (o1, o2) ->{

return o1.compareTo(o2);

};

System.out.println(com1.compare(12,4));

System.out.println("=====================");

Comparator<Integer> com2 = (o1, o2) -> o1.compareTo(o2); // 可以使用方法引用 Integer :: compareTo

System.out.println(com2.compare(4,21));

}

```

运行效果:

!6.执行效果(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/acbe975ce2024e1db562004e3defedbd\~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=350\&h=107\&s=4594\&e=png\&b=272935)

JUnit单元测试的使用

  1. 需要导入的jar包 下载地址(https://jar-download.com/artifacts/junit/junit)

!导入jar包(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/8dcf6bbabdc94e50852d2019e88e4ed7\~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=194\&h=63\&s=1950\&e=png\&b=ffffff)

  1. 导入 (IDEA的话就通过 File -> Project Structure -> Libraries-> 按下`+` Java, 选择对应的文件夹, 需包含👆上面两个 jar 包) 然后·在Modules里对应的地方打勾即可

!导入步骤(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6c4f83767e0c473f9c707dbb0c8903d7\~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=1063\&h=192\&s=15339\&e=png\&b=414450)

  1. 创建单元测试类, 进行测试 (可以不使用main函数的情况下 测试某一部分代码的功能) 测试的注解一般是 @Test

!@Test(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/8bac7967702d459ba7ba716c9cfe596d\~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=218\&h=89\&s=4721\&e=png\&b=2e313e)

  1. 编写单元测试方法
相关推荐
像我这样帅的人丶你还3 小时前
Java 后端详解(四):分页与搜索
java·javascript·后端
她的男孩3 小时前
数据权限为什么不能只靠注解?Forge 的 Mapper 层 SQL 改写源码拆解
java·后端·架构
tntxia3 小时前
Mybatis的日志输入
java
亦暖筑序5 小时前
Java 8老系统Browser Agent实战:三层拦截把AI操作后台变成可审计流程
java·后端·设计模式
用户298698530148 小时前
Java 实现 Word 文档加密与权限解除
java·后端
Yeats_Liao8 小时前
14:Servlet中的页面跳转-Java Web
java·后端·架构
未秃头的程序猿9 小时前
告别"if-else地狱"!Java 21模式匹配,代码优雅了10倍
java·后端·面试
鹤望兰6759 小时前
字节跳动国际支付-后端开发-三面面经
java
Flittly9 小时前
【AgentScope Java新手村系列】(14)人机交互
java·spring boot·spring
RainCity9 小时前
Java Swing 自定义组件库分享(十二)
java·笔记·后端