以前我以为只有Python才会有generator,看来当时的我才年轻,后来认真研读《Thinking in Java》之后大有感悟,原来Java亦有generator,故做一次记录分享。过程中主要通过具体代码展示笔记简单比较Python generator来加深理解。

1、什么是Java Generator

  关于Generator我的理解主要如下,如有不妥,希望大家指正!

  (1)python中这样理解:在一个过程中一边循环一边计算返回,能让单独的循环功能模块(也可以理解为一个单线程)不断“挂起”生成结果而不会一直循环到return为止。 其中能说明的就是求斐波拉契数列,关键字yield是不断返回下一个b的值,也就是return next()

    注意:有些博主以为Python协程中有yield关键字,所以跟generator是一回事,但是我不这么认为。

 def fib(max):
n, a, b = 0, 0, 1
while n < max:
#之前是print (b)
yield b
a, b = b, a + b
n = n + 1

输出结果:

#第一次next():1
print(fib(1))
#第二次next():2
print(fib(2))
#第三次next():3
print(fib(2))

  (2)Java中这样理解:将泛型应用于接口,接口必须有返回类型为泛型T的next()方法,是一种专门负责创建对象的类。在很多设计模式都会用到(比如工厂方法模式),类似于Iterable对象中使用使用next()不断获得下一个值,这里泛型接口中的next()方法返回创建对象。

2、实现一个CommonGenerator通用生成器

  实现一个通用生成器,通过next不断返回一个对象的实例

interface Generator

 /**
* Generator泛型接口
* @author Jian
* @param <T>
*/
public interface Generator<T> {
T next();
}

CommonGenerator:

 /**
* CommonGenerator继承Generator泛型接口,实现通过next不断返回实例
* @author Jian
* @param <T>
*/
public class CommonGenerator<T> implements Generator<T>{
private Class<T> type;
/**
* CommonGenerator Constructor
* @param type
*/
public CommonGenerator(Class<T> type) {
this.type = type;
}
/**
* next()不断返回xxx.class的对象
*/
@Override
public T next() {
try {
//传入class返回对象
return type.newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @param type 传入创建类xxx.class
* @return CommonGenerator实例
*/
public static <T> Generator<T> create(Class<T> type){
return new CommonGenerator<T>(type);
}
}

TestObject:

 /**
* 测试类:统计返回测试类的引用实例的数目
* @author Jian
*
*/
public class TestObject {
private static long counter= 0;//统计计数器
public String toString() {
//注意:这里return中不能用this,否则会出现递归
return "TestObject " + (counter++);
}
}

MainClass:

 public class MainClass {
public static void main(String[] args) {
Generator<TestObject> generator = new CommonGenerator<>(TestObject.class);
for(int i=0;i<3;i++) {
//generator.next()返回对象,输出调用toString方法
System.out.println(generator.next());
}
}
}

输出:

TestObject 0
TestObject 1
TestObject 2

Java Generator的更多相关文章

  1. MyBatis 使用Generator自动生成Model , Dao, mapper

    最近   我新建了一 个maven 项目,使用的是spring + springmvc + mybatis框架. 听说Mybatis可以自动生成model和mapper以及dao层,我就从网上查了查资 ...

  2. springboot中通用mapper结合mybatis generator的使用

    通用mapper就是指的是  tk.mybatis  包下的.这个是通用mapper就是说自动生成的dao层需要继承这个框架提供的mapper类.而我们之前用的org.mybatis这个最开始是普通的 ...

  3. Android OpenCV实现图片叠加,水印

    关于如何用纯OpenCV实现图片叠加的例子实在是太少,太多的是使用 C++,JNI实现的,如果要用C++的话,我们为啥不转行做C++ 下面的例子基于 Android JavaCV 实现了在im_bea ...

  4. SpringBoot 3.SpringBoot 整合 MyBatis 逆向工程以及 MyBatis 通用 Mapper

    一.添加所需依赖,当前完整的pom文件如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&qu ...

  5. Jmeter--thrift接口压测

    1. 安装thrift 2. 新建maven工程,代码结构如下 3. pom设置,按配置存放thrift文件和打包描述文件(具体代码见附件,根据需要改变配置信息) 4. thrift需要手动添加nam ...

  6. greenDAO学习分享总结

    greenDAO(最新版本号V2.0.0的Readme) ======== greenDAO is a light & fast ORM solution for Android that m ...

  7. Web实际应用中的编码问题

    一. JSP页面有关编码的介绍 ---->>假设不做不论什么设置,页面默认ISO-8859-1编码(Western European). ---->><%@ page c ...

  8. CentOS7 安装 OpenCV 的一些问题解决办法

    由于强迫症,实在受不了root权限的旧gcc才能使用boost而普通权限却是最新版gcc,经过一番折腾后,终于把配置全部弄好了,实际上就只需要把新版gcc的各个文件放到系统找到旧gcc的地方,并建立新 ...

  9. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

随机推荐

  1. 【APP测试(Android)】--升级更新

  2. mui.fire()触发自定义事件

    导读:添加自定义事件监听操作和标准js事件监听类似,可直接通过window对象添加,通过mui.fire()方法可触发目标窗口的自定义事件. 监听自定义事件 添加自定义事件监听操作和标准js事件监听类 ...

  3. ABP框架系列之三十三:(Module-System-模块系统)

    Introduction ASP.NET Boilerplate provides an infrastructure to build modules and compose them to cre ...

  4. using python read/write HBase data

    A. operations on Server side 1. ensure hadoop and hbase are working properly 2. install thrift:  apt ...

  5. java易错题

    (选择二项) 8 A: B: C: D: (选择一项) 9 A: B: C: D: 正确答案是 A 您回答的是 B 回答错误 正确答案是 B,D 您回答的是 A,C 回答错误 (选择一项) 18 A: ...

  6. PowerShell工作流学习-1-嵌套工作流和嵌套函数

    关键点: a)嵌套深度没有任何语法限制,但是嵌套三个层次的工作流不支持任何通用参数,包括工作流通用参数 b)嵌套工作流可以调用当前范围和任何父范围内的工作流和函数 c)工作流不允许递归调用,脚本和函数 ...

  7. MySQL-5.7安装

    2.1 下载mysql 网址:https://www.mysql.com/ [root@localhost ~]# mkdir -p /root/soft/MySQL [root@localhost ...

  8. VIBE(前景检测)

    1.VIBE思想: 为每个像素点存储了一个样本集,样本集中采样值就是该像素点过去的像素值和其邻居点的像素值,然后将每一个新的像素值和样本集进行比较来判断是否属于背景点. 2.VIBE模型初始化 通用的 ...

  9. 「LOJ2000~2023」各省省选题选做

    「LOJ2000~2023」各省省选题选做 「SDOI2017」数字表格 莫比乌斯反演. 「SDOI2017」树点涂色 咕咕咕. 「SDOI2017」序列计数 多项式快速幂. 我们将超过 \(p\) ...

  10. LeetCode算法题(长期更新)

    1.给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样 ...