Java中的函数式编程(四)方法引用method reference
写在前面
方法引用
public static void simpleMethodReference() {
Map<String, Integer> wordMap = new HashMap<>(); // 等同于 wordMap.computeIfAbsent("hello", s -> s.length());
wordMap.computeIfAbsent("hello", String::length); // 输出为 {hello=5}
System.out.println(wordMap);
}
1. object::instanceMethod
public static void objectInstanceMethodReference() {
String me = "me"; // wordMap 的 key 是给定的单词,value是不区分大小写,与单词 "me" 比较后得出的值
Map<String, Integer> wordMap = new HashMap<>(); // me::compareToIgnoreCase 等价于 s -> me.compareToIgnoreCase(s)
wordMap.computeIfAbsent("him", me::compareToIgnoreCase);
wordMap.computeIfAbsent("you", s -> me.compareToIgnoreCase(s)); System.out.println(wordMap);
}
2. Class::staticMethod
public static void classStaticMethodReference() {
List<String> list = Arrays.asList("Guangdong", "Zhejiang", "Jiangsu"); // System.out::println 等价于 s -> System.out.println(s)
list.forEach(System.out::println);
}
3. Class::instanceMethod
public static void classInstanceMethodReference() {
Map<String, Integer> wordMap = new HashMap<>();
Integer wordLen = wordMap.computeIfAbsent("hello", String::length);
System.out.println(wordMap);
}
4. Class::new
public static void ctorMethodReference() {
List<String> list = Arrays.asList("1.1", "2.2", "3.3"); // BigDecimal::new 根据上下文推断,等价于 s -> new BigDecimal(s)
Stream<BigDecimal> stream = list.stream().map(BigDecimal::new);
List<BigDecimal> decimalList = stream.collect(Collectors.toList());
System.out.println(decimalList); // 构建一个新的 Stream ,之前的 Stream 已经被关闭了
Stream<BigDecimal> stream1 = list.stream().map(BigDecimal::new); // BigDecimal[]::new ,数组的构造器引用,等价于 x -> new BigDecimal[x]
BigDecimal[] decimalArray = stream1.toArray(BigDecimal[]::new);
for (BigDecimal d : decimalArray) {
System.out.println(d);
}
}
5. this::instanceMethod和super::instanceMethod
public class SuperMethodReferenceExample {
public static void main(String[] args) {
ThreadWaiter waiter = new ThreadWaiter();
waiter.run();
} public static class Waiter {
public void sayHi() {
System.out.println("Hello, man!");
}
} public static class ThreadWaiter extends Waiter {
@Override
public void sayHi() {
System.out.println("Hello, thread!");
} public void run() {
// 指定调用父类 Waiter 的 sayHi 方法
Thread t = new Thread(super::sayHi);
t.start();
}
}
}
上述代码的输出为:
结语
Java中的函数式编程(四)方法引用method reference的更多相关文章
- Java 中的函数式编程(Functional Programming):Lambda 初识
Java 8 发布带来的一个主要特性就是对函数式编程的支持. 而 Lambda 表达式就是一个新的并且很重要的一个概念. 它提供了一个简单并且很简洁的编码方式. 首先从几个简单的 Lambda 表达式 ...
- Java中的函数式编程(二)函数式接口Functional Interface
写在前面 前面说过,判断一门语言是否支持函数式编程,一个重要的判断标准就是:它是否将函数看做是"第一等公民(first-class citizens)".函数是"第一等公 ...
- 方法引用(Method reference)和invokedynamic指令详细分析
方法引用(Method reference)和invokedynamic指令详细分析 invokedynamic是jvm指令集里面最复杂的一条.本文将详细分析invokedynamic指令是如何实现方 ...
- Java中的函数式编程(三)lambda表达式
写在前面 lambda表达式是一个匿名函数.在Java 8中,它和函数式接口一起,共同构建了函数式编程的框架. lambda表达式乍看像是匿名内部类的一种语法糖,但实际上,它们是两种本质不同的事物 ...
- Java中的函数式编程(五)Java集合框架中的高阶函数
写在前面 随着Java 8引入了函数式接口和lambda表达式,Java 8中的集合框架(Java Collections Framework, JCF)也增加相应的接口以适应函数式编程. 本文的 ...
- Java中的函数式编程(六)流Stream基础
写在前面 如果说函数式接口和lambda表达式是Java中函数式编程的基石,那么stream就是在基石上的最富丽堂皇的大厦. 只有熟悉了stream,你才能说熟悉了Java 的函数式编程. 本文主要介 ...
- Java中的函数式编程(七)流Stream的Map-Reduce操作
写在前面 Stream 的 Map-Reduce 操作是Java 函数式编程的精华所在,同时也是最为复杂的部分.但一旦你啃下了这块硬骨头,那你就真正熟悉Java的函数式编程了. 如果你有大数据的编程经 ...
- Java中的函数式编程(八)流Stream并行编程
写在前面 在本系列文章的第一篇,我们提到了函数式编程的优点之一是"易于并发编程". Java作为一个多线程的语言,它通过 Stream 来提供了并发编程的便利性. 题外话: 严格来 ...
- java 方法引用(method reference)
it -> it != null等价于Objects::nonNull
随机推荐
- MySQL——select语句
select: 基本语法:select 列名 或 * from 对象(表.视图...) where: = > < <> != like ----> like 'old%' ...
- noip模拟44
A. Emotional Flutter 直接将所有黑块平移到 \([1-k,0]\) 的区间即可,然后找有没有没被覆盖过的整点 注意特判 \(1-k\) 以及 \(0\) 的可行性,考场这里写挂成 ...
- JVM-调优-命令
目录 jps 命令格式 option参数 示例 jstat 命令格式 参数 option 参数总览 option 参数详解 -class -compiler -gc -gccapacity -gcut ...
- spark集群的构建,python环境
个人笔记,问题较多 符号说明 [] 表示其中内容可以没有 su [root] 获取root权限 vi /etc/sudoers 1.点击I或Insert获得插入权限 2.在root ALL=(ALL) ...
- PHP中的数组分页实现(非数据库)
在日常开发的业务环境中,我们一般都会使用 MySQL 语句来实现分页的功能.但是,往往也有些数据并不多,或者只是获取 PHP 中定义的一些数组数据时需要分页的功能.这时,我们其实不需要每次都去查询数据 ...
- CentOS8安装ntp实现时间同步
在CentOS8.0中默认不再支持ntp软件包,时间同步将由chrony来实现,像我这种习惯了ntp同步时间的,一时难以去适应chrony. 本文将通过wlnmp提供的源,来安装ntp服务 添加wln ...
- Java基础(六)——集合
一.概述 1.介绍 为什么出现集合? 答:面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,对对象进行存储,集合就是存储对象最常用的一种方式. 数组和集合类同是容器,有何不同? ...
- 超详细unittest单元测试框架总结
unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者 ...
- django url配置-反向解析-视图函数-HttpRequest对象-HttpResponse对象-cookies-session-redis缓存session
""" --视图概述:-- 作用:视图接受WEB请求,并响应WEB请求 本质:视图就是一个python中的函数 响应: 1.网页: 一.重定向 二.错误视图 400,50 ...
- P3309-[SDOI2014]向量集【线段树,凸壳】
正题 题目链接:https://www.luogu.com.cn/problem/P3309 题目大意 \(n\)个操作 在序列末尾加入一个向量\((x,y)\) 询问加入的第\(l\sim r\)个 ...