写一例Kotlin编写的Processing程序,充分调用函数式编程思维和面向接口的编程思维,供自己和读者参考学习。

初衷

想要实现一行行的文字排版功能,每一行作为一个单位,可制定显示的位置、大小、文字内容,而且具体信息在主程序中定义(不在类中写死)我把此类命名为BillBoard

代码

import processing.core.PApplet

class BillBoard (_app : PApplet, _name:String,_posx: Int, _posy:Int) : IDraw{
var infomation : String = "" //默认的文本信息
set(value) {
field = value
}
var app : PApplet? = null
var posx : Int = 0
var posy : Int = 0
var name : String = ""
get() {
return field
}
init {
app = _app
posx = _posx
posy = _posy
name = _name
} var sum = { -> Unit}
lateinit var sum2 : () -> Int
/*
fun setDrawFunc(block: () -> Unit )
{
sum = block
}
*/
override fun draw() {
app!!.push()
app!!.translate(posx.toFloat(),posy.toFloat())
if (sum2() == 0)
app!!.text(infomation,0f,0f) app!!.pop()
}
} interface IDraw{ fun draw()
}

BillBoard类从IDraw接口继承出来,实现了draw()方法。类中设置了一个sumsum2,都表示一个函数,具体指绘制的过程,前者没有返回值(返回值为Unit),后者为了回头做一个判断依据设返回值为Int。draw()中做了一次判断,判断sum2()值是否是0,如果是代表使用默认的文本信息,如果不是则使用外界的信息。



接下来是ShowSystem类:

class ShowSystem (app: PApplet){
var drawlists: MutableList<IDraw> = ArrayList()
var billBoards: MutableList<BillBoard> = ArrayList()
init
{
//实例BillBoard,参数为id、横向坐标、纵向坐标
val bb1 : BillBoard = BillBoard(app,"b1",20,50)
val bb2 : BillBoard = BillBoard(app,"b2",100,300)
val bb3 : BillBoard = BillBoard(app,"b3",400,250) drawlists.add(bb1)
drawlists.add(bb2)
drawlists.add(bb3)
billBoards.add(bb1)
billBoards.add(bb2)
billBoards.add(bb3) }
//定义默认的文本信息的方法
fun setBoardInfo(name:String, infomation:String){
billBoards.filter { it.name.equals(name) }.forEach { it.infomation = infomation }
}
//定义具体绘制方法的方法1 - sum没有返回值
fun setBoardType(name:String, func :() -> Unit){
billBoards.filter { it.name.equals(name) }.forEach { it.sum = func}
}
//定义具体绘制方法的方法2 - sum2有返回值的
fun setBoardType2(name:String, func :() -> Int){
billBoards.filter { it.name.equals(name) }.forEach { it.sum2 = func}
}
//遍历绘制
fun run(){
for(drawunit in drawlists){
drawunit.draw()
} }
}

其中使用了kotlin的函数式编程技术和思想,如容器中的filterforEach等方法,让代码看的很清爽简洁



最后是主程序:

import processing.core.PApplet
import processing.core.PConstants
import processing.core.PFont class BoardShowApp : PApplet(){
var showSystem :ShowSystem = ShowSystem(this) override fun settings() {
size(800,400)
smooth(4)
} override fun setup() {
val simheifont : PFont = createFont("C:\\Windows\\Fonts\\simhei.ttf",32.0f)
val simkaifont : PFont = createFont("C:\\Windows\\Fonts\\simkai.ttf",60.0f) showSystem.setBoardInfo("b1","你好,我的朋友!")
showSystem.setBoardInfo("b2","gfdgdg")
showSystem.setBoardInfo("b3","aasanbcvbncbcsad") showSystem.setBoardType2("b1") {
textSize(60f)
textFont(simheifont)
return@setBoardType2 0
}
showSystem.setBoardType2("b2") {
textSize(30f)
textFont(simheifont) text("今天是多么美好",0f,0f)
return@setBoardType2 1
} showSystem.setBoardType2("b3") {
textSize(30f)
textFont(simkaifont) text("明天要去憧憬",0f,0f)
return@setBoardType2 1
}
} override fun draw() {
background(60) showSystem.run()
}
} fun main(args: Array<String>) {
var bsapp = BoardShowApp()
PApplet.runSketch(arrayOf("BoardShow1"),bsapp)
}

创立一个showsystem,setup()中初始化参数,最重要的是定义类中具体的绘制方法,并返回进相应的值,返回1代表使用外界的文本信息,返回0代表使用对象中的文本信息。

【本来是想着直接在外头使用对象中的成员变量,或是定义或是使用对象中的具体值,经过一番尝试,并没有码出正确的代码,因此退一步求其次,求了上述的一种方法】

结尾

最后执行的画面如下:





这样的设计无疑是更灵活易扩展的,但是笔者的功底并不能很好的驾驭它,后续还得加倍学习更深的内容和更多的练习,共勉。

Kotlin编写Processing程序(使用函数式编程思维和面向接口方式)的更多相关文章

  1. 用函数式编程思维解析anagrams函数

    //函数式编程思维分析 这个排列函数 const anagrams = str => { if (str.length <= 2) return str.length === 2 ? [s ...

  2. swift语言的特征:类型系统与函数式编程:swift是面向类型和面向函数编程的语言

    swift语言的特征: 类型系统:值类型与引用类型.泛型.协议类型 函数式编程:

  3. Kotlin高阶函数与函数式编程详解

    函数可变参数: 在上一次https://www.cnblogs.com/webor2006/p/11518425.html中学到了可变参考,关于可变参数有如下规则说明: “一个方法中,只允许一个参数为 ...

  4. 【大前端攻城狮之路】JavaScript函数式编程

    转眼之间已入五月,自己毕业也马上有三年了.大学计算机系的同学大多都在北京混迹,大家为了升职加薪,娶媳妇买房,熬夜加班跟上线,出差pk脑残客户.同学聚会时有不少兄弟已经体重飙升,开始关注13号地铁线上铺 ...

  5. [译]通往 Java 函数式编程的捷径

    原文地址:An easier path to functional programming in Java 原文作者:Venkat Subramaniam 译文出自:掘金翻译计划 以声明式的思想在你的 ...

  6. 2017.4.9 函数式编程FP

    函数编程(简称FP)不只代指Haskell Scala等之类的语言,还表示一种编程范式,和面向对象的编程方式一样,是编程思维,软件思考方式,也称面向函数编程. 编程的本质是组合,组合的本质是范畴Cat ...

  7. Java8函数式编程以及Lambda表达式

    第一章 认识Java8以及函数式编程 尽管距离Java8发布已经过去7.8年的时间,但时至今日仍然有许多公司.项目停留在Java7甚至更早的版本.即使已经开始使用Java8的项目,大多数程序员也仍然采 ...

  8. Python函数式编程,map/reduce,filter和sorted

    什么是函数式编程? 与面向对象编程(Object-oriented programming)和过程式编程(Procedural programming)并列的编程范式. 最主要的特征是,函数是第一等公 ...

  9. restapi(6)- do it the functional way, 重温函数式编程

    再次看了看上篇博客的源代码,发现连自己都看不懂了.想是为了赶时间交货不知不觉又回到OOP行令模式了,看看下面这段代码: (post & parameters('pid,'desc.?,'wid ...

随机推荐

  1. Spark + GraphX + Pregel

    Spark+GraphX图 Q:什么是图?图的应用场景 A:图是由顶点集合(vertex)及顶点间的关系集合(边edge)组成的一种网状数据结构,表示为二元组:Gragh=(V,E),V\E分别是顶点 ...

  2. 使用OkHttp和OkHttpGo获取OneNET云平台数据

    图1是OneNET官网关于NB-IoT文档关于批量查询设备最新数据的介绍,可以看到GET方法的URL地址和两个头部信息(图2是Htto请求消息结构).所以在写url时,还要添加两行头部字段名,不然获取 ...

  3. 这一篇TCP总结请收下

    前言 很高兴遇见你~ TCP这些东西,基本每个程序猿都或多或少是掌握的了.虽然感觉在实际开发中没有什么用武之处,但,面试他要问啊 而最近大家伙过完年,也都在准备春招,我也一样.阅读了一些okHttp源 ...

  4. linux系统忘记root的登录密码

    参考链接:https://www.jb51.net/article/146541.htm  亲测有效 使用场景 linux管理员忘记root密码,需要进行找回操作. 注意事项:本文基于centos7环 ...

  5. RocketMQ基础概念剖析,并分析一下Producer的底层源码

    由于篇幅原因,本次的源码分析只限于Producer侧的发送消息的核心逻辑,我会通过流程图.代码注释.文字讲解的方式来对源码进行解释,后续应该会专门开几篇文章来做源码分析. 这篇博客聊聊关于Rocket ...

  6. 你要是还学不会,请提刀来见 Typora+PicGo+Gitee + node.js 打造个人高效稳定优雅图床

    你要是还学不会,请提刀来见 Typora+PicGo+Gitee + node.js 打造个人高效稳定优雅图床 经过前面两弹的介绍,相信大家对图床都不陌生了吧, 但是小魔童觉得这样做法还是不方便,使用 ...

  7. 后端程序员之路 59、go uiprogress

    gosuri/uiprogress: A go library to render progress bars in terminal applicationshttps://github.com/g ...

  8. 解读KMP算法

    前后断断续续搞了5个月,每次都以为自己懂了, 但是要写的时候都不知从何下手,然后又是各种找博客,看帖子,所以这次试着用自己的语言写一个博客. 首先,KMP算法就是从一个模板字符串(S) 中匹配目标字符 ...

  9. LeetCode-二叉树的镜像

    二叉树的镜像 二叉树的镜像 给定一个二叉树,输出二叉树的镜像. 只需要使用一个简单的递归,分别对左右子树反转后再对当前结点进行反转. #include<iostream> #include ...

  10. POJ-3436(网络流+最大流+输出路径)

    ACM Computer Factory POJ-3436 题目就是一个工厂n个加工机器,每个机器有一个效率w,q个材料入口,q个材料出口,每个口有三个数表示状态,1表示一定有入/出的材料,0表示没有 ...