以前我以为只有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. MPLAB X IDE V4.15 创建工程,编译,问题处理

    初步接触,有错误的地方还请大神们务必提出来,防止误导他人 硬件环境:MCU--PIC18F67K22 仿真下载器--ICD 3 编译环境:MPLAB X IDE V4.15 中文版 工作需要接触到了P ...

  2. 《Linux就该这么学》第七天课程

    昨天晚上我找了刘老师决定了报考红帽RHCSA,RHCE认证,我不指望这个认证能给我带来工作上的某些福利,毕竟出去闯靠的是实力外加运气 我只是希望通过这个认证来激励自己! 下面是分享的一些干货! 原创地 ...

  3. VIP之Switch

    Switch II 最大能连接12路输入与12路输出 不能合并数据数 每个输入可以驱动多个输出 每个输出只能被一个输入驱动 当输入没有连接到输出时,可以禁止掉 每个被禁止的输入可以设置成停止或者消耗模 ...

  4. 启动 mysql 时报错

    通过mysql -u用户名 -p密码 的命令连接 Mysql数据库时 报错 "can't connect to local mysql serverthrough  socket'/var/ ...

  5. android 动画学习

    android动画基础简介及使用方法:http://www.cnblogs.com/ldq2016/p/5407061.html

  6. HPS基本概念及其设计

    DE1-SOC开发版上的FPGA在一个基于ARM的用户定制系统(SOC)中集成了分立处理器(HPS).FPGA和数字信号处理(DSP)功能.HPS是基于ARM cortex-A9双核处理器,具有丰富的 ...

  7. cobub razor 安装及使用

    server端安装及配置 apache2 + Mysql5.7 + php7 + redis 参见:http://docs.cobub.com/pages/viewpage.action?pageId ...

  8. liunx----配置搜狗输入法

    话不多说直接看步骤 * 系统版本: ubuntu 18.04.1 // 查看命令为: # cat /etc/issue 1. 先查看当前系统是否存在 fcitx 框架: # dpkg -l | gre ...

  9. Java学习笔记44(多线程一:Thread类)

    多线程的概念:略 多线程的目的:提高效率 主线程: package demo; //主线程 public class Demo { public static void main(String[] a ...

  10. Windows.UI.Cred.dll损坏导致不能设置 PIN 密码

    心血来潮,重装系统. 然后发现不能设置 PIN,UWP界面在输完两个PIN后直接卡死(第一次设置的时候不需要输入第一行的PIN) google无果,打开系统日志,发现 上网下载一个对应版本的Windo ...