惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

U
Unit 42
A
About on SuperTechFans
J
Java Code Geeks
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Stack Overflow Blog
Stack Overflow Blog
Recent Announcements
Recent Announcements
GbyAI
GbyAI
F
Fortinet All Blogs
Blog — PlanetScale
Blog — PlanetScale
MongoDB | Blog
MongoDB | Blog
MyScale Blog
MyScale Blog
aimingoo的专栏
aimingoo的专栏
H
Help Net Security
月光博客
月光博客
博客园 - Franky
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Apple Machine Learning Research
Apple Machine Learning Research
The Cloudflare Blog
WordPress大学
WordPress大学
S
SegmentFault 最新的问题
T
Tailwind CSS Blog
Jina AI
Jina AI
有赞技术团队
有赞技术团队
博客园_首页

Java技术经验分享

生产故障处理SOP分享 | Java技术经验分享 系统稳定性建设实践总结【转载】 | Java技术经验分享 valine访问leancloud国际版异常,评论失效修复 | Java技术经验分享 匆匆忙忙的2021 | Java技术经验分享 聊一下换工作 | Java技术经验分享 IoT系列(2):WIFI设备常见配网方案介绍 | Java技术经验分享 IoT系列(1):什么是物联网 | Java技术经验分享 Java8特性2 - StreamApi | Java技术经验分享 设计模式(5)-适配器模式 | Java技术经验分享 设计模式(4)-建造者模式 | Java技术经验分享 设计模式(3)-原型模式与浅拷贝和深拷贝 | Java技术经验分享 设计模式(2)-工厂模式图文介绍 | Java技术经验分享 设计模式(1)-带你了解3类8种单例模式 | Java技术经验分享 Java时间处理5---Java8中时区相关类库介绍 | Java技术经验分享 Java时间处理4---Java8中LocalDate、LocalTime、LocalDateTime介绍 | Java技术经验分享 Java时间处理3---Java8中Instant、Duration、Period、Clock介绍 | Java技术经验分享 一些有意思的问答 | Java技术经验分享 Nacos系列博客说明 | Java技术经验分享 菜鸡程序员的2019年度总结 | Java技术经验分享 Java中“附近的人”实现方案讨论及代码实现 | Java技术经验分享 Java时间处理2----时区TimeZone类方法探究(Java8以前) | Java技术经验分享 Java时间处理1----Date和Calendar方法探究(Java8以前) | Java技术经验分享 FastJson中JSONString、JavaBean、JSONObject、JSONArray的转换关系及API示例 | Java技术经验分享 2019.11软考软件设计师归来心得体会及复习备考指南 | Java技术经验分享 你还没用过“约定式提交”吗?那你赶紧来补补知识吧 | Java技术经验分享 教你如何看懂UML中的类图及类图中的关系 | Java技术经验分享 设计模式总览 | Java技术经验分享 萌新入门Github请看这里,学不会远程教 | Java技术经验分享 Hexo的工作原理探究 | Java技术经验分享 Hexo-theme-butterfly修改调整记录教程 | Java技术经验分享
Java8特性1 - lambda表达式&函数式接口 | Java技术经验分享
文章作者: LarsCheng · 2020-11-10 · via Java技术经验分享

引子

要求创建一个线程,线程中输出hello world

没学Lambda前的画风:

1
2
3
4
5
6
7
8

class myThread implements Runnable{
@Override
public void run() {
System.out.println("hello world!");
}
}
new Thread(new myThread()).start();
1
2
3
4
5
6
7

new Thread(new Runnable() {
@Override
public void run() {
System.out.println("hello world!");
}
}).start();

当你学会Lambda表达式之后,画风是这样的:

1
new Thread(() -> System.out.println("hello world!")).start();

是不是有种打开新世界大门的感觉,一起来看下Java8的新特性之一Lambda表达式

函数式接口:接口中只有一个抽象方法的接口

这种接口都可以用lambda表达式来实现

JDK内置四大基础函数式接口

  • Consumer#accept(Object)
    • void accept(T t); 消费型接口,接受一个参数,无返回
  • Supplier#get()
    • T get(); 供给型接口,无参数,但有返回值
  • Function#apply(Object)
    • R apply(T t); 函数型接口,接收参数T,返回一个R
  • Predicate#test(Object)
    • boolean test(T t); 断定型接口,接收参数T,判断其是否满足某一约束,返回一个boolean值

从源码中可以看到这四个基础接口都有注解@FunctionalInterface,他们都有一个特点:

有且仅有一个抽象方法

下面通过以前的写法、Java8的lambda写法进行对比学习

Consumer

消费型接口,接收一个参数,但无返回值

其接口核心源码如下:

1
2
3
4
5
6
7
8
9





@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}

写一个小示例:

1
2
3
4
5
6
7
8
9
10
11
12

Consumer<String> consumer1 = new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
};
consumer1.accept("接收1个参数,无返回值的函数式接口实现");


Consumer<String> consumer2 = s -> System.out.println(s);
consumer2.accept("接收1个参数,无返回值的lambda表达式");

Supplier

供给型接口,无参数,但有返回值

其接口核心源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14






@FunctionalInterface
public interface Supplier<T> {




T get();
}

写一个小示例:

1
2
3
4
5
6
7
8
9
10
11
12
Supplier<Integer> supplier1 = new Supplier<Integer>() {
@Override
public Integer get() {
return new Random().nextInt(100);
}
};
System.out.println("supplier接口原始写法获取随机数:" +supplier1.get());

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

Supplier<Integer> supplier2 = () -> new Random().nextInt(100);
System.out.println("supplier接口Lambda表达式写法获取随机数:" +supplier2.get());

Function

函数型接口,接收参数T,返回一个R

其核心源码如下:

1
2
3
4
5
6
7
8
9
10






@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}

新老用法对比例子

1
2
3
4
5
6
7
8
9
10
11
12
Function<Integer, String> function1 = new Function<Integer, String>() {
@Override
public String apply(Integer integer) {
return "接收整型参数:" + integer;
}
};
System.out.println(function1.apply(100));

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

Function<Integer, String> function2 = i -> "接收整型参数:" + i;
System.out.println(function2.apply(1000));

Predicate

断定型接口,接收参数T,判断其是否满足某一约束,返回一个boolean值

核心源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15





@FunctionalInterface
public interface Predicate<T> {







boolean test(T t);
1
2
3
4
5
6
7
8
9
10
11
12
Predicate<Integer> predicate1 = new Predicate<Integer>() {
@Override
public boolean test(Integer integer) {
return integer > 100;
}
};
System.out.println("大于100 ? " + predicate1.test(101));

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

Predicate<Integer> predicate2 = integer -> integer>100;
System.out.println("大于100 ? " + predicate2.test(99));