Java 8函数编程轻松入门(四)方法引用
C#中系统提供了许多IEnumerable的扩展方法。同样在Java 8中新引入了Collector类。
1.方法引用
- 定义: 简而言之:就是一个Lambda表达式。在Java 8中,我们我们会使用Lambda表达式创建匿名方法。但是更多的时候,我们的Lambda表达式可能需要调用一个已存在的方法。这时候我们可以通过个一个方法名字来引用已存在的方法会更加清晰。
- 语法: Classname::methodName
- 与C#的类比: 类似C#的委托。C#的委托其实就是方法的指针。而在Java 8中,方法引用其实就是将方法的地址引用指向调用方。
- C#代码
class Program
{
static void Main(string[] args)
{
Func<int, int, int> calc = Add;
}
public static int Add(int i, int j)
{
return i + j;
}
}
- Java 8代码 Lambda表达式
public class Chapter05 {
public static void main(String[] args) {
BinaryOperator<Integer> r = (x, y) -> x + y;
int result = r.apply(1, 2);
}
}
- Java 8代码 方法引用
public class Chapter05 {
public static void main(String[] args) {
BinaryOperator<Integer> r = Chapter05::add;
int result = r.apply(1, 2);
}
public static Integer add(Integer i, Integer j) {
return i + j;
}
}
2.使用Collectors
- 定义: 一种通用的、从流(Stream)生成复杂值的结构。
2.1转换成其他集合(toList(),toSet())
public static void main(String[] args) {
List<Integer> arrays = new ArrayList<Integer>() {{
add(1);
add(2);
add(3);
add(4);
add(5);
}};
List<Integer> afterArrays = arrays.stream().filter(u -> u > 2).collect(Collectors.toList());
}
- List<> 数据结构转换成Set<>数据结构。下面的ArrayList结构转换为HashSet结构
public static void main(String[] args) {
List<Integer> arrays = new ArrayList<Integer>() {{
add(1);
add(2);
add(3);
add(4);
add(5);
}};
Set<Integer> setArrays = arrays.stream().collect(Collectors.toSet());
}
- 上面是Stream类库在背后自动为你挑选合适的数据类型。当然你也可以指定对应类型的数据结构。如下指定TreeSet类型
Set<Integer> treesetArrays=arrays.stream().collect(Collectors.toCollection(TreeSet::new));
2.2转换成值
- 如Stream提供的min\max以及Collectors提供的minBy\maxBy
int max=treesetArrays.stream().max(Comparator.comparing(u->u)).get();
int collectMax=treesetArrays.stream().collect(Collectors.maxBy(Comparator.comparing(u->u))).get();
System.out.println("max:"+max);
System.out.println("CollectMax:"+collectMax);
int avg= treesetArrays.stream().collect(Collectors.averagingInt(u->u)).intValue();
System.out.println("Avg:"+avg);
2.3数据分块
- 类似C#的IEnumerable的GroupBy()
- 有Person的集合。按照性别分组
public class Person {
public String name;
public int age;
public String sex;
public Person(){
}
public Person(String n,int a,String sex){
this.name=n;
this.age=a;
this.sex=sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
public class GroupByTest {
public static void main(String[] args){
List<Person> persons=new ArrayList<>();
persons.add(new Person("jack",23,"男"));
persons.add(new Person("Tom",20,"男"));
persons.add(new Person("Su",21,"女"));
persons.add(new Person("Lily",22,"女"));
Map<String,List<Person>> group=persons.stream().collect(Collectors.groupingBy(u->u.getSex()));
}
}
2.4Collectors.joining
- 收集流中的数据,生成自定义的格式的字符串
String str=persons.stream().map(u->u.getName()).collect(Collectors.joining(","));
//jack,Tom,Su,Lily
3.Lambda细节
Java 8 可以使用computeIfAbsent缓存。
未使用computeIfAbsent
public class DetailsTest {
public static void main(String[] args){
Map<String,String> keyval=new HashMap<>();
String val=keyval.get("hello");
if(val==null){
keyval.put("hello","world");
}
System.out.print(keyval.get("hello"));
}
}
- 使用computeIfAbsent。现在只需要一句话
public class DetailsTest {
public static void main(String[] args){
Map<String,String> keyval=new HashMap<>();
keyval.computeIfAbsent("hello",u->keyval.put(u,"world"));
}
}
- Map也添加了forEach函数
keyval.forEach((k,v)->{System.out.println("key:"+k+",value:"+v);});
总结:
- 1.方法引用是一种引用方法的轻量级语法,类似C#的委托
- 2.收集器类似C#的IEnumerable的扩展方法
Java 8函数编程轻松入门(四)方法引用的更多相关文章
- Java 8函数编程轻松入门(三)默认方法详解(default function)
default出现的原因 Java 8中对API最大的改变在于集合类,Java在持续演进,但是它一直保持着向后兼容. 在Java 8中为Collection接口增加了stream方法,这意味着所有实现 ...
- Java 8函数编程轻松入门(二)Stream的使用
在C#中,微软基于IEnumerable接口,提供许多便捷的扩展方法,便于实际的开发.在Java 1.8中,Collection接口新增了default stream方法.我们可以针对java集合,在 ...
- Java 8函数编程轻松入门
函数接口介绍 在Java1.8中,新增了Lambda表达式.在.net3.5(C# 3.0)在原先的匿名方法基础上演变出了Lambda表达式.学过C# Lambda表达式的同学,对于Java的Lamb ...
- Java 8函数编程轻松入门(五)并行化(parallel)
1.并发与并行的区别 并发: 一个时间段内有几个程序都处于已启动到运行完毕之间,且这几个程序都是在同一个处理机上运行.但在任一个时刻点只有一个程序在处理机上运行 并行: 在同一个时刻,多核处理多个任务 ...
- Java使用Protocol Buffers入门四步骤
Protocol Buffers(简称protobuf)是谷歌的一项技术.用于将结构化的数据序列化.反序列化.经经常使用于网络传输. 这货实际上相似于XML生成和解析.但protobuf的效率高于XM ...
- Java 8方法引用使用指南
[编者按]本文作者为拥有15年 Java 开发经验的资深程序员 Per-Åke Minborg,主要介绍如何灵活地解析 Java 中的方法引用.文章系国内 ITOM 管理平台 OneAPM 编译呈现. ...
- Java基础教程——方法引用
方法引用 Lambda表达式的代码,是否可以再简洁?--方法引用 对象/类名::方法名 参数都不用写明. import java.util.function.Consumer; public clas ...
- C#基础入门 四
C#基础入门 四 方法参数 值参数:不附加任何修饰符: 输出参数:以out修饰符声明,可以返回一个或多个给调用者: 如果想要一个方法返回多个值,可以用输出参数来处理,输出参数由out关键字标识,如st ...
- Java 8 中的方法引用,轻松减少代码量,提升可读性!
1. 引言 Java8中最受广大开发中喜欢的变化之一是因为引入了 lambda 表达式,因为这些表达式允许我们放弃匿名类,从而大大减少了样板代码,并提高了可读性. 方法引用是lambda表达式的一种特 ...
随机推荐
- ASP.NET Aries 入门开发教程6:列表数据表格的格式化处理及行内编辑
前言: 为了赶进度,周末也写文了! 前几篇讲完查询框和工具栏,这节讲表格数据相关的操作. 先看一下列表: 接下来我们有很多事情可以做. 1:格式化 - 键值的翻译 对于“启用”列,已经配置了格式化 # ...
- 通往全栈工程师的捷径 —— react
腾讯Bugly特约作者: 左明 首先,我们来看看 React 在世界范围的热度趋势,下图是关键词“房价”和 “React” 在 Google Trends 上的搜索量对比,蓝色的是 React,红色的 ...
- HashSet HashTable 与 TreeSet
HashSet<T>类 HashSet<T>类主要是设计用来做高性能集运算的,例如对两个集合求交集.并集.差集等.集合中包含一组不重复出现且无特性顺序的元素. HashSet& ...
- ASP.NET Core应用针对静态文件请求的处理[5]: DefaultFilesMiddleware中间件如何显示默认页面
DefaultFilesMiddleware中间件的目的在于将目标目录下的默认文件作为响应内容.我们知道,如果直接请求的就是这个默认文件,那么前面介绍的StaticFileMiddleware中间件会 ...
- JavaScript特性(attribute)、属性(property)和样式(style)
最近在研读一本巨著<JavaScript忍者秘籍>,里面有一篇文章提到了这3个概念. 书中的源码可以在此下载.我将源码放到了线上,如果不想下载,可以直接访问在线网址,修改页面名就能访问到相 ...
- 一起学 Java(二)面向对象
一.方法函数 函数也称为方法,就是定义在类中的具有特定功能的一段独立代码.用于定义功能,提高代码的复用性. 函数的特点1> 定义函数可以将功能代码进行封装,便于对该功能进行复用:2> 函数 ...
- HTTP API接口安全设计
HTTP API接口安全设计 API接口调用方式 HTTP + 请求签名机制 HTTP + 参数签名机制 HTTPS + 访问令牌机制 有没有更好的方案? OAuth授权机制 OAuth2.0服务 ...
- 移动BPM解决方案分享
畅通开放 无边界的渠道 效率倍增 更高效的处理方式 即时共享 更强大的决策能力 各种终端应用 帮您实现:新任务通知.任务预警.催办.任务审批.任何数据汇总提醒消息通知...... 短信 客户端: ...
- 编译器开发系列--Ocelot语言2.变量引用的消解
"变量引用的消解"是指确定具体指向哪个变量.例如变量"i"可能是全局变量i,也可能是静态变量i,还可能是局部变量i.通过这个过程来消除这样的不确定性,确定所引用 ...
- Android之Dedug--Circular dependencies cannot exist in AnimatorSet
今日,在学习AnimatorSet时,使用play.with.after.before时,代码书写如下: ObjectAnimator animator1 = ObjectAnimator.ofFlo ...