以前我以为只有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. Spring 的配置详解

    Bean元素 Spring创建对象的方式 (1)空参构造方式 (2)静态工厂(了解) (3)实例工厂方式 Bean元素进阶 (1)scope属性 a.singleton (2)生命周期属性 Sprin ...

  2. linux 基础 文件系统 用户权限

    描述Linux系统的启动过程? 1.开机自检 BIOS 2.MBR引导 3.GRUB菜单 4.加载内核 5.运行init进程 6.从/etc/inittab读取运行级别 7.根据/etc/rc.sys ...

  3. kei下无法跳转到函数的定义处

    1 勾选“option for target”----“output”----"Browse information" 2 重新编译整个工程, 执行上面两个步骤就可以跳转了.

  4. 基于ESP32的uart通讯

    本文源码地址为:http://download.csdn.net/download/noticeable/9961054 ESP32上有三个UART通讯接口,设备号,从0~2,即UART0,UART1 ...

  5. Vuejs——(8)Vuejs组件的定义

    版权声明:出处http://blog.csdn.net/qq20004604   目录(?)[+]   本篇资料来于官方文档: http://cn.vuejs.org/guide/components ...

  6. MyBatis 源码分析 - 缓存原理

    1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 Redis 或 memcached 等缓存中间件,拦截大量奔向数据库的请求,减轻数据库压力.作为一个重要的组件,MyBatis 自然 ...

  7. 关于java集合的一些操作

    1.数组转集合 java提供了一个方法:Arrays.asList(T... a)的方法. 测试: String[] arr = {"Lida","huanda" ...

  8. 从文本中读取字符——feof函数问题

    feof()函数 函数原型:int feof(FILE *fp): 函数功能:检测流上的文件结束符,如果文件结束,则返回非0值,否则返回0,文件结束符只能被clearerr()函数清除 (函数feof ...

  9. AndroidStudio项目制作倒计时模块

    前言 大家好,给大家带来AndroidStudio项目制作倒计时模块的概述,希望你们喜欢 项目难度 AndroidStudio项目制作倒计时模块的难度,不是很大,就是主要用了Timer和TimerTa ...

  10. [CocoaPods]使用Pod Lib创建

    入门 我们将使用pod lib create引导过程来创建整个pod .那么让我们从初始命令开始: pod lib create MyLibrary 注意:要使用您自己的pod-template,您可 ...