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函数编程轻松入门(四)方法引用的更多相关文章

  1. Java 8函数编程轻松入门(三)默认方法详解(default function)

    default出现的原因 Java 8中对API最大的改变在于集合类,Java在持续演进,但是它一直保持着向后兼容. 在Java 8中为Collection接口增加了stream方法,这意味着所有实现 ...

  2. Java 8函数编程轻松入门(二)Stream的使用

    在C#中,微软基于IEnumerable接口,提供许多便捷的扩展方法,便于实际的开发.在Java 1.8中,Collection接口新增了default stream方法.我们可以针对java集合,在 ...

  3. Java 8函数编程轻松入门

    函数接口介绍 在Java1.8中,新增了Lambda表达式.在.net3.5(C# 3.0)在原先的匿名方法基础上演变出了Lambda表达式.学过C# Lambda表达式的同学,对于Java的Lamb ...

  4. Java 8函数编程轻松入门(五)并行化(parallel)

    1.并发与并行的区别 并发: 一个时间段内有几个程序都处于已启动到运行完毕之间,且这几个程序都是在同一个处理机上运行.但在任一个时刻点只有一个程序在处理机上运行 并行: 在同一个时刻,多核处理多个任务 ...

  5. Java使用Protocol Buffers入门四步骤

    Protocol Buffers(简称protobuf)是谷歌的一项技术.用于将结构化的数据序列化.反序列化.经经常使用于网络传输. 这货实际上相似于XML生成和解析.但protobuf的效率高于XM ...

  6. Java 8方法引用使用指南

    [编者按]本文作者为拥有15年 Java 开发经验的资深程序员 Per-Åke Minborg,主要介绍如何灵活地解析 Java 中的方法引用.文章系国内 ITOM 管理平台 OneAPM 编译呈现. ...

  7. Java基础教程——方法引用

    方法引用 Lambda表达式的代码,是否可以再简洁?--方法引用 对象/类名::方法名 参数都不用写明. import java.util.function.Consumer; public clas ...

  8. C#基础入门 四

    C#基础入门 四 方法参数 值参数:不附加任何修饰符: 输出参数:以out修饰符声明,可以返回一个或多个给调用者: 如果想要一个方法返回多个值,可以用输出参数来处理,输出参数由out关键字标识,如st ...

  9. Java 8 中的方法引用,轻松减少代码量,提升可读性!

    1. 引言 Java8中最受广大开发中喜欢的变化之一是因为引入了 lambda 表达式,因为这些表达式允许我们放弃匿名类,从而大大减少了样板代码,并提高了可读性. 方法引用是lambda表达式的一种特 ...

随机推荐

  1. Java消息队列--JMS概述

    1.什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...

  2. 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)

    前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ...

  3. 微信小程序(微信应用号)组件讲解

    这篇文章主要讲解微信小程序的组件. 首先,讲解新建项目.现在有句话:招聘三天以上微信小程序开发,这个估计只能去挖微信的工程师了.技术新,既然讲解,那我们就从开始建项目讲解. 打开微信web开发者工具, ...

  4. java观察者模式

      像activeMQ等消息队列中,我们经常会使用发布订阅模式,但是你有没有想过,客户端时如何及时得到订阅的主题的信息?其实就里就用到了观察者模式.在软件系统中,当一个对象的行为依赖于另一个对象的状态 ...

  5. 在 SharePoint Server 2016 本地环境中设置 OneDrive for Business

    建议补丁 建议在sharepoint2016打上KB3127940补丁,补丁下载地址 https://support.microsoft.com/zh-cn/kb/3127940 当然不打,也可以用O ...

  6. 项目游戏开发日记 No.0x000001

    14软二杨近星(2014551622) 既然已经决定了开发软件, 时不时就要练练手, 还要时不时的去寻找素材, 因为开发的人物设定就是DotA2里面的祈求者, 所以, 就去找了他的相关人物图片和模型, ...

  7. 如何让spring mvc web应用启动时就执行特定处理

    Asp.Net的应用中通过根目录下的Global.asax,在Application_Start方法中做一些初始化操作,比如:预先加载缓存项对网站热点数据进行预热,获取一些远程的配置信息等等. Spr ...

  8. Node.js Express连接mysql完整的登陆注册系统(windows)

    windows学习环境: node 版本: v0.10.35 express版本:4.10.0 mysql版本:5.6.21-log 第一部分:安装node .Express(win8系统 需要&qu ...

  9. 我的MYSQL学习心得(十二) 触发器

    我的MYSQL学习心得(十二) 触发器 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数 ...

  10. Ubuntu(Linux) + mono + jexus +asp.net MVC3 部署

    感谢  张善友 的建议,我把 微信订餐  由nginx 改成 jexus,目前运行状况来说,确实稳定了很多,再次感谢. 部署步骤参考 jexus官网:http://www.jexus.org/ htt ...