初次听说java中的函数对象可能,比较的陌生。可以类比着来理解一下,人们常说java中没有了指针,殊不知,java中的对象引用就是指针,有时候我们说一个对象往往指的就是这个对象的引用,也就是说基本上把对象的引用很对象等同了。比如Integer a = new Integeer(3);我们说定义了一个整形对象a其实这个说法是错误的,a只是争相对象new Integer(3)的一个引用而已(相当于是一个指针),这就是一种对象和引用混淆的说法,当然约定俗成就不会说这种话叫法是错误的。

那么函数对象,如果把对象理解成指针的话,也就是说,函数对象其实就是函数指针的概念。

函数对象做了这么一件事,我们可以定义一个只有方法而没有数据的类,然后把这个类的对象传递给别的方法,这时传递的这个对象就是一个函数对象。

说起这个函数对象,其实存在那么一种设计模式,叫做策略模式,其主体就是函数对象的应用。

为什么会出现函数对象这种形式呢?很简单,如果我们要比较一些元素,那么我们一般会在这些元素的类型定义上是想Comparable接口,但是现实情况往往比我们想想的复杂的多,可能实现这个接口并不能满足我们的比较接口,这个时候我们就把比较规则封装到一个函数对象中,然后把需要比较的数据元素和这个比较函数对象一块传递给业务函数看下面一个例子:

我们要找出一个字符串数组中,字符串长度最长的字符串》

// 比较两个字符串的长度
class FindMaxlength implements Comparator<String>
{ @Override
public int compare(String o1, String o2) {
// TODO Auto-generated method stub
return o1.length()-o2.length();
} } public class TestProgram {
public static void main(String[] args) {
String[] arr = {"ZEBRA", "alligator", "crocodile"};
System.out.println(findMa(arr, new FindMaxlength()));// 传入一个函数对象(指针)
} public static <T> T maxLength(T[] arr, Comparator<? super T> cmp)// 传递一个函数对象
{
int maxIndex = 0; for(int i = 0; i < arr.length; i++){
if(cmp.compare(arr[i], arr[maxIndex]) > 0)
maxIndex = i;
} return arr[maxIndex];
}
}

Java中的函数对象的更多相关文章

  1. java中的string对象深入了解

    这里来对Java中的String对象做一个稍微深入的了解. Java对象实现的演进 String对象是Java中使用最频繁的对象之一,所以Java开发者们也在不断地对String对象的实现进行优化,以 ...

  2. java中对集合对象list的几种循环访问

    java中对集合对象list的几种循环访问的总结如下 1 经典的for循环 public static void main(String[] args) { List<String> li ...

  3. 关于C++与Java中虚函数问题的读书笔记

    之前一直用C++编程,对虚函数还是一些较为肤浅的理解.可近期由于某些原因搞了下Java,发现有些知识点不熟,于是站在先驱巨人的肩上谈谈C++与Java中虚函数问题. Java中的虚函数 以下是段别人的 ...

  4. JAVA中字符串函数subString的用法小结

    本篇文章主要是对JAVA中字符串函数subString的用法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 String str; str=str.substring(int begi ...

  5. (转)java中对集合对象list的几种循环访问总结

    Java集合的Stack.Queue.Map的遍历   在集合操作中,常常离不开对集合的遍历,对集合遍历一般来说一个foreach就搞定了,但是,对于Stack.Queue.Map类型的遍历,还是有一 ...

  6. Java中创建实例化对象的几种方式

    Java中创建实例化对象有哪些方式? ①最常见的创建对象方法,使用new语句创建一个对象.②通过工厂方法返回对象,例:String s =String.valueOf().(工厂方法涉及到框架)③动用 ...

  7. Java中字节与对象之间的转换

    近期公司里面用到了消息队列,而正如我们知道的是消息队列之间的是通过二进制形式的.以下就分享一下java中字节与对象之间的转换. 主要是用到了ByteArrayOutputStream和ObjectOu ...

  8. STL中的函数对象实现负数的定义

    // // main.cpp // STL中的函数对象 // // Created by mac on 2019/5/2. // Copyright © 2019年 mac. All rights r ...

  9. Java中创建的对象多了,必然影响内存和性能

    1, Java中创建的对象多了,必然影响内存和性能,所以对象的创建越少越好,最后还要记得销毁.

随机推荐

  1. A+B problem (High-precision)

    The "A+B problem" is very easy,but I failed for many times. The code: #include<iostream ...

  2. 使用fullPage.js遇到的问题以及翻译

    使用fullPage.js做一简单页面,遇一古怪问题:.section中的h1标签始终被一插件生成的标签包裹,导致样式调整好不困难!花费数小时排查为何会生成这样一个标签,最终在fullPage.js的 ...

  3. JavaScript 语法

    一.JavaScript简介 1.JavaScript是个什么东西? 它是个脚本语言,需要有宿主文件,它的宿主文件是HTML文件. 2.它与Java什么关系? 没有什么直接的联系,Java是Sun公司 ...

  4. 【.Net Framework 体积大?】不安装.net framework 也能运行!?原理简介-2

    接上一篇 [.Net Framework 体积大?]不安装.net framework 也能运行!?开篇叙述-1 昨天写了一个引子,还是有读者对这套“小把戏”感兴趣.那么不辜负大家的希望,争取博主不做 ...

  5. EF操作扩展之async

    EF的操作类网上很多类,我只是把我在平时项目中的类进行一些改进和扩展,扩展了部分同步和异步的EF操作 接口 /// <summary> /// 接口数据操作基础类 /// </sum ...

  6. LINQ查询表达式和LAMBDA点标记方法基础

    在上一篇文章中,我们介绍了LINQ的一些基本用法,这一篇我们来看下另一种更简洁更优雅的表达式,Lambda表达式,也可以叫做点标记方法. 相信大家在实际工作中都用到过这两种方式,下面我们还是用实例来看 ...

  7. 深度神经网络(DNN)反向传播算法(BP)

    在深度神经网络(DNN)模型与前向传播算法中,我们对DNN的模型和前向传播算法做了总结,这里我们更进一步,对DNN的反向传播算法(Back Propagation,BP)做一个总结. 1. DNN反向 ...

  8. Unity3d中如何混用三种脚本语言?

    首先要明白,这三种说的混用是指文件级别的混用,就是说一个文件是由一种语言写的.而不是说你这一个文件可以混用这三种语言,注意这是不允许的. 第二要明白,在unity3d中为什么可以使用三种语言混合开发? ...

  9. 学习笔记——Java核心技术之接口、继承与多态练习题

    1.创建一个抽象类,验证它是否可以实例化对象. package com.lzw; public abstract class UseCase3 { abstract void doit(); publ ...

  10. Ghostscript.Net Pdf 转 Image

    需求: 项目中需要实现PPT转Image的功能,之前项目中用的是使用Office COM组件实现的功能,通过.NET与Office COM组件的互操作(Interop)来操作Office文档 但是在生 ...