精华内容
下载资源
问答
  • R语言高级绘图命令标题-颜色等)

    万次阅读 2016-12-27 10:46:52
    R还可以在现有图形(通过高级绘图命令绘制)的基础上增加一些额外的显示,如标题、绘制坐标轴、在特定的位置增加图形(比如辅助线,拟合线)或文字等。 这些函数在R中称为低级作图命 令(low-level plotting commands...

     

    plot(x)          以x的元素值为纵坐标、以序号为横坐标绘图

    plot(x,y)        x(在x-轴上)与y(在y-轴上)的二元作图

    sunflowerplot(x,y)同上,但是以相似坐标的点作为花朵,其花瓣数目为点的个数

    pie(x)饼图

    boxplot(x)盒形图(“box-and-whiskers”)

    stripchart(x)把x的值画在一条线段上,样本量较小时可作为盒形图的替代

    coplot(x~y|z)关于z的每个数值(或数值区间)绘制x与y的二元图

    interaction.plot(f1, f2, y)如果f1和f2是因子,作y的均值图,以f1的不同值作为x轴, 而f2的不同值对应不同曲线;可以用选项fun指定y的其他的统计量(缺省计算均值,fun=mean)


     

    matplot(x,y)二元图,其中x的第一列对应y的第一列,x的第二列对应y的第二列,依次类推。

    dotchart(x)如果x是数据框,作Cleveland点图(逐行逐列累加图)

    fourfoldplot(x)用四个四分之一圆显示2X2列联表情况(x必须是dim=c(2,2,k)的数组,或者是dim=c(2,2)的矩阵,如果k=1)

    assocplot(x)Cohen–Friendly图,显示在二维列联表中行、列变量偏离独立性的程度

    mosaicplot(x)列联表的对数线性回归残差的马赛克图

    pairs(x)如果x是矩阵或是数据框,作x的各列之间的二元图

    plot.ts(x)如果x是类"ts"的对象,作x的时间序列曲线,x可以是多元的,但是序列必须有相同的频率和时间

    ts.plot(x)同上,但如果x是多元的,序列可有不同的时间但须有相同的频率

    hist(x)x的频率直方图

    barplot(x)x的值的条形图

    qqnorm(x)正态分位数-分位数图

    qqplot(x,y)y对x的分位数-分位数图

    contour(x,y,z)等高线图(画曲线时用内插补充空白的值)

    filled.contour(x,y,z)同上,等高线之间的区域是彩色的,并且绘制彩色对应的值的图例

    image(x,y,z)同上,但是实际数据大小用不同色彩表示

    persp(x,y,z)同上,但为透视图

    stars(x)如果x是矩阵或者数据框,用星形和线段画出

    symbols(x,y,...)在由x和y给定坐标画符号(圆,正方形,长方形,星,温度计式或者盒形图),符号的类型、大小、颜色等由另外的变量指定

    termplot(mod.obj)回归模型(mod.obj)的(偏)影响图

    heatmap(x)热度图


    其他的包中可能也会提供额外的图表类型,比如:

    quantmod包提供的K线图:chartSeries()

    portfolio包提供的tree map(板块层级图):map.market(id, area, group, color)用矩形面积来表示数值,可用于分析磁盘空间占用

    lattice包提供的平行坐标图:parallel(data)

     

    绘图示例

    > x = rnorm(10)
    > y = rnorm(10)
    > plot(x,y)

    Screenshot

    绘图参数

    很多时候,你可能需要调整图形的显示方式。R的绘图参数几乎可以定制图形的任何显示(如标题,坐标轴,颜色,字体等)。

    R 拥有一个数目很大的图形参数列表。该列表包括控制线条样式,颜色,图形排列和文字对齐等方面的参数。

    更改图形参数有两种方式,一种是直接在绘图函数中设置参数,这种方式只影响当前绘图函数,但是不是所有的参数都能够通过这种方式设置;另一种是通过par()函数设置,这种方式会影响当前绘图设备上的所有图形。

    下面先看一个直接设置参数的例子:

    >plot(x,y,type="b",main="main title",sub='sub title',xlab="x axis",ylab='y axis',asp=0.2)

    1 $ screenshot

    使用par()函数的例子:

     

    opar <- par()#备份原来的绘图参数

    par(bg="lightyellow", col.axis="blue", mar=c(4, 4, 2.5, 0.25))

    plot(x, y, xlab="Ten random values", ylab="Ten other values",

    xlim=c(-2, 2), ylim=c(-2, 2), pch=22, col="red", bg="yellow",

    bty="l", tcl=-.25, las=1, cex=1.5)

    par(opar)#恢复原来的绘图参数


    通过?par可以查到所有参数的说明。下面列举最常用的一些参数:

    adj控制关于文字的对齐方式,0是左对齐,0.5是居中对齐,1是右对齐,值> 1时对齐位置在文本右边的地方,取负值时对齐位置在文本左边的地方;如果给出两个值(例如c(0, 0)),第二个只控制关于文字基线的垂直调整

    bg指定背景色(例如bg="red", bg="blue"; 用colors()可以显示657种可用的颜 色名)

    bty控制图形边框形状,可用的值为: "o", "l", "7", "c", "u" 和"]" (边框和字符 的外表相像);如果bty="n"则不绘制边框

    cex控制缺省状态下符号和文字大小的值;另外,cex.axis控制坐标轴刻度数字大小,cex.lab控制坐标轴标签文字大小,cex.main控制标题文字大小,cex.sub控制副标题文字大小

    col控制符号的颜色;和cex类似,还可用:col.axis, col.lab, col.main, col.sub

    font控制文字字体的整数(1: 正常,2: 斜体,3: 粗体,4: 粗斜体);和cex类似, 还可用: font.axis, font.lab, font.main, font.sub

    las控制坐标轴刻度数字标记方向的整数(0: 平行于轴,1: 横排,2: 垂直于轴,3: 竖排)

    lty控制连线的线型,可以是整数(1: 实线,2: 虚线,3: 点线,4: 点虚线,5: 长虚线,6: 双虚线),或者是不超过8个字符的字符串(字符为从"0"到"9"之间的数字)交替地指定线和空白的长度,单位为磅(points)或象素,例如lty="44"和lty=2效果相同

    lwd控制连线宽度的数字

    mar控制图形边空的有4个值的向量c(bottom, left, top, right), 缺省值 为c(5.1, 4.1, 4.1, 2.1)

    mfcolc(nr,nc)的向量,分割绘图窗口为nr行nc列的矩阵布局,按列次序使用各子窗口

    mfrow同上,但是按行次序使用各子窗口(参照 4.1.2)

    pch控制符号的类型,可以是1到25的整数,也可以是""里的单个字符

    2 $ screenshot

    ps控制文字大小的整数,单位为磅(points)

    pty指定绘图区域类型的字符,"s": 正方形,"m":最大利用

    tck指定轴上刻度长度的值,单位是百分比,以图形宽、高中最小一个作为基数; 如果tck=1则绘制grid

    tcl同上,但以文本行高度为基数(缺省下tcl=-0.5)

    xaxt如果xaxt="n"则设置x-轴但不显示(有助于和axis(side=1, ...)联合使用)

    yaxt如果yaxt="n"则设置y-轴但不显示(有助于和axis(side=2, ...)联合使用)

     

    低级绘图命令

    R还可以在现有图形(通过高级绘图命令绘制)的基础上增加一些额外的显示,如标题、绘制坐标轴、在特定的位置增加图形(比如辅助线,拟合线)或文字等。

    这些函数在R中称为低级作图命 令(low-level plotting commands)。一些常用的低级图形命令包括:

    scatter.smooth(x, y, …)LOESS(局部加权散点平滑)拟合曲线

    points(x, y)添加点(可以使用选项type=)

    lines(x, y)同上,但是添加线

    text(x, y, labels,…)在(x,y)处添加用labels指定的文字;典型的用法是: plot(x, y, type=”n”); text(x, y, names)

    mtext(text,side=3, line=0,…)在边空添加用text指定的文字,用side指定添加到哪一边(参照 下面的axis());line指定添加的文字距离绘图区域的行数

    segments(x0, y0,x1, y1)从(x0,y0)各点到(x1,y1)各点画线段

    arrows(x0, y0,x1, y1, angle= 30,code=2)同上但加画箭头,如果code=2则在各(x0,y0)处画箭头,如 果code=1则在各(x1,y1)处画箭头,如果code=3则在两端都画箭头; angle控制箭头轴到箭头边的角度

    abline(a,b)绘制斜率为b和截距为a的直线

    abline(h=y)在纵坐标y处画水平线

    abline(v=x)在横坐标x处画垂直线

    abline(lm.obj)画由lm.obj确定的回归线

    rect(x1, y1, x2, y2)绘制长方形,(x1, y1)为左下角,(x2,y2)为右上角

    polygon(x, y)绘制连接各x,y坐标确定的点的多边形

    legend(x, y, legend)在点(x,y)处添加图例,说明内容由legend给定

    title()添加标题,也可添加一个副标题

    axis(side, vect)画坐标轴,side=1时画在下边,side=2时画在左边,side=3时画在上边,side=4时画在右边。可选参数at指定画刻度线的位置坐标

    box()在当前的图上加上边框

    rug(x)在x-轴上用短线画出x数据的位置

    locator(n, type=”n”, …)在用户用鼠标在图上点击n次后返回n次点击的坐标(x, y);并可以在点击处绘制符号(type=”p”时)或连线(type=”l”时),缺省情 况下不画符号或连线

    下面的例子中,使用plot(...,type="n")绘制一个“空白”的图形, 然后用低级函数来添加点,坐标轴,标签等:

    低级绘图命令

    R还可以在现有图形(通过高级绘图命令绘制)的基础上增加一些额外的显示,如标题、绘制坐标轴、在特定的位置增加图形(比如辅助线,拟合线)或文字等。

    这些函数在R中称为低级作图命 令(low-level plotting commands)。一些常用的低级图形命令包括:

    scatter.smooth(x, y, …)LOESS(局部加权散点平滑)拟合曲线

    points(x, y)添加点(可以使用选项type=)

    lines(x, y)同上,但是添加线

    text(x, y, labels,…)在(x,y)处添加用labels指定的文字;典型的用法是: plot(x, y, type=”n”); text(x, y, names)

    mtext(text,side=3, line=0,…)在边空添加用text指定的文字,用side指定添加到哪一边(参照 下面的axis());line指定添加的文字距离绘图区域的行数

    segments(x0, y0,x1, y1)从(x0,y0)各点到(x1,y1)各点画线段

    arrows(x0, y0,x1, y1, angle= 30,code=2)同上但加画箭头,如果code=2则在各(x0,y0)处画箭头,如 果code=1则在各(x1,y1)处画箭头,如果code=3则在两端都画箭头; angle控制箭头轴到箭头边的角度

    abline(a,b)绘制斜率为b和截距为a的直线

    abline(h=y)在纵坐标y处画水平线

    abline(v=x)在横坐标x处画垂直线

    abline(lm.obj)画由lm.obj确定的回归线

    rect(x1, y1, x2, y2)绘制长方形,(x1, y1)为左下角,(x2,y2)为右上角

    polygon(x, y)绘制连接各x,y坐标确定的点的多边形

    legend(x, y, legend)在点(x,y)处添加图例,说明内容由legend给定

    title()添加标题,也可添加一个副标题

    axis(side, vect)画坐标轴,side=1时画在下边,side=2时画在左边,side=3时画在上边,side=4时画在右边。可选参数at指定画刻度线的位置坐标

    box()在当前的图上加上边框

    rug(x)在x-轴上用短线画出x数据的位置

    locator(n, type=”n”, …)在用户用鼠标在图上点击n次后返回n次点击的坐标(x, y);并可以在点击处绘制符号(type=”p”时)或连线(type=”l”时),缺省情 况下不画符号或连线

    下面的例子中,使用plot(...,type="n")绘制一个“空白”的图形, 然后用低级函数来添加点,坐标轴,标签等:

     

    opar <- par()#备份绘图参数

    par(bg="lightgray", mar=c(2.5, 1.5, 2.5, 0.25))#设置绘图参数

    plot(x, y, type="n", xlab="", ylab="", xlim=c(-2, 2),  ylim=c(-2, 2), xaxt="n", yaxt="n")#绘制“空白”图形,设定坐标轴范围

    rect(-3, -3, 3, 3, col="cornsilk")#修改绘图区域的颜色

    points(x, y, pch=10, col="red", cex=2)#画点

    axis(side=1, c(-2, 0, 2), tcl=-0.2, labels=FALSE)#添加坐标轴

    axis(side=2, -1:1, tcl=-0.2, labels=FALSE)

    title("How to customize a plot with R (ter)",#添加标题

    font.main=4, adj=1, cex.main=1)

    mtext("Ten random values", side=1, line=1, at=1, cex=0.9, font=3)#绘制坐标轴标签

    mtext("Ten other values", line=0.5, at=-1.8, cex=0.9, font=3)

    mtext(c(-2, 0, 2), side=1, las=1, at=c(-2, 0, 2), line=0.3,

    col="blue", cex=0.9)

    mtext(-1:1, side=2, las=1, at=-1:1, line=0.2, col="blue", cex=0.9)

    par(opar)#恢复绘图参数


    3 $ screenshot

    交互式绘图命令

    有时需要根据用户的想法而不是数据进行绘图,即交互式绘图。R对此有很好的支持,允许用户直接用鼠标在一个图上提取和提交信息。

    R中最简单、最常用的函数是locator(n, type)。等待用户用鼠标左键点击n个位置,如果设置了type,还可以根据这n个位置直接进行低级绘图。

    比如:

    x = rnorm(10) plot(x) locator(5,"o")


    locator也可以先不绘图,只把用户点击的坐标记录下来:

    r = locator(2) r


    另一个有意思的交互函数是identify(x, y, labels),可以参考帮助自己学习。

    展开全文
  • Windows通过cmd命令获取文件列表 例子

    万次阅读 2018-09-14 14:00:29
    有时我们需要获取文件夹下所有文件名的列表,较为快捷的方式就是通过cmd命令了。 - 举个栗子——在文件夹Test中有如下文件: 1. 获取文件夹所有文件和文件夹的名字列表 使用以下语句: ... \Test>dir...

    有时我们需要获取文件夹下所有文件名的列表,较为快捷的方式就是通过cmd命令了。

    - 举个栗子——在文件夹Test中有如下文件:

    Test文件夹

    1. 获取文件夹所有文件和文件夹的名字列表

    使用以下语句:

    ...\Test>dir /B >list.txt

    结果:
    在list.txt中:

    0
    1
    1.txt
    2.txt
    case01.jpg
    list.txt
    test.png
    

    2.获取文件夹特定格式文件名字列表

    使用以下语句:

    ...\Test>dir *.txt /B >list.txt

    结果:
    在list.txt中:

    1.txt
    2.txt
    list.txt
    

    3.按照修改时间排列获取文件名字列表

    使用以下语句:

    ...\Test>dir /B /o:d >list.txt

    结果:
    在list.txt中:

    case01.jpg
    test.png
    1.txt
    2.txt
    1
    0
    list.txt
    
    • 关键字补充说明
    • [drive:][path][filename]            指定要列出的驱动器、目录和/或文件。

    • /A        显示具有指定属性的文件:
      属性:
             D 目录        R 只读文件
             H 隐藏文件         A 准备存档的文件
             S 系统文件         I 无内容索引文件
              L 解析点         - 表示“否”的前缀

    • /B       使用空格式(没有标题信息或摘要)。

    • /C       在文件大小中显示千位数分隔符。这是默认值。用 /-C 来 禁用分隔符显示。

    • /D       跟宽式相同,但文件是按栏分类列出的。

    • /L       用小写。

    • /N       新的长列表格式,其中文件名在最右边。

    • /O       用分类顺序列出文件。
      排列顺序:
                           N 按名称(字母顺序)       S 按大小(从小到大)
                           E 按扩展名(字母顺序)       D 按日期/时间(从先到后)
                           G 组目录优先                  - 反转顺序的前缀

    • /P       在每个信息屏幕后暂停。

    • /Q        显示文件所有者。

    • /R       显示文件的备用数据流。

    • /S       显示指定目录和所有子目录中的文件。

    • /T        控制显示或用来分类的时间字符域。

      时间段:
                        C       创建时间
                        A        上次访问时间
                       W       上次写入的时间

    • /W       用宽列表格式。

    • /X      显示为非 8.3 文件名产生的短名称。格式是 /N 的格式,短名称插在长名称前面。如果没有短名称,在其位置则显示空白。

    • /4        用四位数字显示年

    展开全文
  • 专注于什么 就像本文的标题已经没有了一样,我们的第一步是从命令式的编码和重构样式转变为更具声明性的样式-FP是一种形式。 这个循环最困扰我。 这是代码的新版本。 class FeedHandler { Webservice webservice ...
    接口文档示例

    接口文档示例

    功能编程(FP)的目的是避免重新分配变量,避免可变的数据结构,避免状态并全程支持函数。 如果将功能性技术应用于日常Java代码,我们可以从FP中学到什么?

    在这个名为“ Functional Java by Example”的系列文章中,我将分8步重构现有的代码,以查看是否可以用Java达到Functional Nirvana

    我对Haskell或F#等“真正的”功能语言没有太多的经验,但是我希望在每篇文章中通过示例来演示将这些实践中的一些应用于每天的Java代码意味着什么。

    希望最后您获得了一些见识,并且知道选择一些有益于您自己的代码库的技术。

    这些都是这些部分:

    • 第1部分–从命令式到声明式
    • 第2部分–命名事物
    • 第3部分–不要使用异常来控制流程
    • 第4部分–首选不变性
    • 第5部分–将I / O移到外部
    • 第6部分–用作参数
    • 第7部分–将失败也视为数据
    • 第8部分–更多纯函数

    我将在每篇文章发表时更新链接。 如果您通过内容联合组织来阅读本文,请查看我博客上的原始文章。

    每次代码也被推送到这个GitHub项目

    免责声明:代码是用Apache的Groovy中,主要是为简洁,所以我不必键入的东西(你知道:打字),其中不要紧的例子。 第二,这门语言只是让我开心。

    为什么要关心函数式编程(FP)?

    如果您不是在时髦的实时流数据事件处理框架上执行Haskell,F#或Scala,则最好打包。 这些天,甚至JavaScript的人都在围绕您的方法旋转函数-这种语言已经存在了一段时间。

    那里有很多文章和视频,使您相信,如果这些天使用功能性潮流,那么您会被旧的OOP束缚所抛弃,坦率地说,它们在几年之内就已经过时了。

    好吧,我在这里告诉您这不是完全正确的,但是FP确实有一些前提,例如可读性,可测试性和可维护性,我们也在我们的(企业)Java代码中力求实现的值正确吗?

    在阅读本文时,多年以来,您可能已经对FP是前进还是后退或2017-2018年年期失败持相同的直言不讳的看法,您只是愿意接受新想法

    通过学习FP,您可以提高每种语言的技能。

    确定自己是什么,你可以从中学到如何自己编程可以从中受益。

    如果您能胜任这项任务,那么让我们从...开始

    现有的一些代码

    关于示例代码的一句话:为这样的博客提供人为的示例是非常棘手的:它应该足够容易吸引广泛的受众,应该足够简单,无需太多上下文就可以理解,但仍然足够有趣以至于导致理想的学习效果。

    展望未来,本系列的每一期将以前一期为基础。 下面是我们将作为起点的代码。

    因此,戴上眼镜,看看您是否熟悉下面的编码样式。

    class FeedHandler {
    
      Webservice webservice
      DocumentDb documentDb
    
      void handle(List<Doc> changes) {
    
        for (int i = 0; i < changes.size(); i++) {
          def doc = changes[i]
          if (doc.type == 'important') {
    
            try {
              def resource = webservice.create(doc)
              doc.apiId = resource.id
              doc.status = 'processed'
            } catch (e) {
              doc.status = 'failed'
              doc.error = e.message
            }
            documentDb.update(doc)
          }
        }
      }
    }
    • 这是某种FeedHandler
    • 它具有两个属性,一些Webservice类和一个DocumentDb类。
    • 有一个handle方法可以对Doc对象列表进行处理。 文件?

    尝试弄清楚这里发生了什么

    ..

    ..

    ..

    做完了吗

    读这样的东西有时会使您感到自己像是一个解析器。

    扫描类名( FeedHandler? )和一个方法( void handle )可以使您感到有些FeedHandler? ,从而为所有目的提供“感觉”。

    但是,弄清楚handle方法中确切“处理”了什么要困难得多。

    • 那里有一个for-loop -但是到底是在迭代什么? 多少次?
    • 调用此变量webservice ,返回称为resource
    • 如果webservice成功返回,则正在迭代的doc (文档?)将更新为状态。
    • 似乎webservice还可以抛出一个Exception ,它被捕获和文档与其他状态更新。
    • 最终,该文档被此documentDb实例“更新”。 看起来像一个数据库。
    • 等等,这仅适用于“重要”文档-在执行上述所有操作之前,首先检查doc.type

    也许,您听说过以下短语:

    读取的代码多于编写的代码。

    看看这块美丽:

    for (int i = 0; i < changes.size(); i++) {

    上面的代码以命令式的方式编写,这意味着操作状态和行为的具体语句被明确地写出。

    • 用零初始化一个int i
    • int i小于changes列表的大小时循环
    • 每次迭代以1递增int i

    用这种命令式(过程)编码风格(大多数主流语言,包括Java,C ++,C#等面向对象编程(OOP)语言,都被设计为主要支持),开发人员编写了计算机所需的确切语句。执行以完成特定任务。

    一些非常命令性(过程性)代码的信号:

    1. 专注于如何执行任务
    2. 状态更改和执行顺序很重要
    3. 许多循环和条件

    该代码明确地侧重于“如何”,这使“什么”难以确定。

    专注于什么

    就像本文的标题已经没有了一样,我们的第一步是从命令式的编码和重构样式转变为更具声明性的样式-FP是一种形式。

    这个循环最困扰我。

    这是代码的新版本。

    class FeedHandler {
    
      Webservice webservice
      DocumentDb documentDb
    
      void handle(List<Doc> changes) {
    
        // for (int i = 0; i < changes.size(); i++) {
        //    def doc = changes[i]
        changes
          .findAll { doc -> doc.type == 'important' }
          .each { doc ->
    
          try {
            def resource = webservice.create(doc)
            doc.apiId = resource.id
            doc.status = 'processed'
          } catch (e) {
            doc.status = 'failed'
            doc.error = e.message
          }
          documentDb.update(doc)
        }
      }
    }

    有什么变化?

    • if (doc.type == 'important')部分已替换为findAll { doc -&gt; doc.type == 'important' } if (doc.type == 'important') findAll { doc -&gt; doc.type == 'important' } findAll { doc -&gt; doc.type == 'important' }再次涉及文档集合本身-意思是“查找所有重要的文档,并仅返回那些重要文档的新集合”
    • 强制性的for-loop (带有中间的i变量)已由文档集合本身上的声明性的each方法所取代-表示“为列表中的每个文档执行一段代码,我不在乎您如何执行” &#55357;&#56898;

    不用担心eachfindAll :这些方法是由Groovy添加的,我将它们与Java在同一代码库中愉快地添加到了任何Collection中,例如Set,List,Map。 Vanilla Java 8具有等效的机制,例如forEach可以更声明性地迭代集合。

    导致可读软件的原因是:

    描述“什么”而不是“如何”

    如果我以更具功能性的方式编写代码,就可以轻松地看到发生了什么,这可以节省我的时间(因为是的,我90%的时间都在读取代码而不是编写代码),并且这样编写代码不太容易出错,因为更少的行会减少隐藏错误的机会。

    现在就这样

    在第2部分中,我们将正确命名事物,为更多功能的编程铺平道路,例如在本系列的后续版本中,“ Either”或“ Try”。

    翻译自: https://www.javacodegeeks.com/2017/11/functional-java-example-part-1-imperative-declarative.html

    接口文档示例

    展开全文
  • 更不用说所有其他的编程逻辑,其中反应流不适合,但它可以用函数式编写,并且比命令式编程的可读性和维护更容易十倍。 有个困扰:如果你需要两个系统之间交换并转换数据怎么办?Stream和Flow如何一起工作?在这种...

    在本指南中,您将学习Java 9中的Flow API如何帮助您使用新的Publisher和Subscriber构建反应模式。阅读之后,您应该能够理解这种新的编程风格及其优缺点。

    本指南重点介绍新的  Flow API,它使我们能够仅使用JDK采用Reactive Programming,而不需要其他库,如RxJava或Project Reactor等。

    但是,在看了API之后,你很快就会发现这个API由几个接口和一个实现组成:

    接口  Flow.Publisher 定义了生成项目和控制信号的方法。

    Flow.Subscriber  接口  定义了接收这些消息和信号的方法。

    Flow.Subscription接口   定义了链接发布服务器和订阅服务器的方法。

    接口  Flow.Processor 定义了一些方法来执行一些高级操作,例如将项目的转换从发布者链接到订阅者。

    最后,SubmissionPublisher类  实现了Flow.Publisher ,它是一个灵活的项目生成器,符合Reactive Streams计划。

    即使没有很多类可以使用,包括Java 9中的这个API也是一个重大变化:第三方可以为依赖于这些接口的库提供Reactive支持,例如从JDBC驱动程序到RabbitMQ的反应式实现。

    从Pull 到Push 再到Pull-Push

    反应式编程主要是消费者控制数据流,由于它集成在主要框架和库分发版(例如Java 9或Spring 5)中,它现在变得流行,并且分布式系统的兴起带来了大量的数据需要相互关联传达。

    回顾过去有助于我们了解其崛起。几年前,从消费者那里获取数据的最流行的技术是基于Pull拉的机制。客户端定期轮询数据,如果可用,他们会读取数据。优点是,在资源较少的情况下,他们可以控制数据流(停止轮询); 主要缺点是在没有任何消耗时通过轮询数据浪费处理时间和/或网络资源。

    随着时间的推移,趋势发生了变化,从生产者那里推送数据并让消费者照顾它变得很受欢迎。问题在于消费者可能拥有比生产者更有限的资源,在消费者缓慢和数据丢失的情况下最终会得到完整的输入缓冲。如果只发生在我们订阅者中的一小部分用户,这可能会很好,但是如果它发生在大多数用户身上呢?我们可以做得更好,减缓我们的生产者发布...

    Reactive Programming附带的混合推拉Pull-Push方法试图带来两全其美:它让消费者负责请求数据并控制来自发布者的流量,这也可以在阻止或丢弃数据时做出决定资源。我们将在下面看到一个很好的实际例子。

    Flow和Stream的区别

    应式编程并不是取代函数编程。两者兼容并且完美地协同工作。虽然Java 8中引入的Streams API非常适合处理数据流(map,reduce和所有变体),但Flow API会在通信方面(请求,减速,丢弃,阻塞等)发挥作用。

    您可以将Streams用作Publisher的数据源,根据需要阻止它们或删除项目。您也可以在订阅者身边使用它们,例如,在收到某些项目后执行聚合。更不用说所有其他的编程逻辑,其中反应流不适合,但它可以用函数式编写,并且比命令式编程的可读性和维护更容易十倍。

    有个困扰:如果你需要两个系统之间交换并转换数据怎么办?Stream和Flow如何一起工作?在这种情况下,我们可以使用Java 8函数将源映射到目标(转换它)但我们不能在发布者和订阅者之间使用Stream,对吗?

    我们可能会想到在两者之间创建一个订阅者,它从原始发布者那里获取项目,转换它,然后像发布者那样发布。好消息:这就是Java 9的Flow.Processor模式, 所以我们只需要实现该接口并在那里编写函数来转换数据。

    就个人而言,我不喜欢全反应,  过度反应或成为反应性布道者(我无法决定具体的术语)。尽量不要为此疯狂。

    案例

    本指南中包含的示例代码模拟了Magazine Publisher用例。发布者只有两个订阅者。

    出版商将为每位订阅者制作一系列20种杂志。他们知道他们的读者在交货时通常不在家,他们想避免邮递员退回杂志或扔掉杂志。这可能发生,因为发布者知道订阅者的邮箱通常很小,无法放置更多邮件(订阅者的缓冲区)。

    取而代之的是,他们实施了一个非常创新的交付系统:用户在他们在家时打电话给他们,他们几乎立即交付一本杂志。出版商计划在办公室为每位订阅者保留一个小盒子,以防有些人在发布杂志后不立即致电该杂志。经理认为在发行人办公室为每个订户保留最多8个杂志的空间已经足够了(注意缓冲区现在是如何在出版商那边)。

    然后,其中一名工人前往经理办公室,警告他们不同的情况:

    如果订阅者的速度足以要求发送,就像发布者正在打印新杂志一样快,就不会有空间问题。

    如果订阅者没有像打印杂志那样以相同的速度打电话,那么这些盒子可能会变满。工人要求管理者应如何  作出反应,以这种情况下:

    将每个用户的盒子大小增加到20,这将解决问题(即发布者方面的更多资源)。

    停止打印直到情况得到修复(订阅者请求至少一个)然后放慢速度,这会损害一些可能足够快以使他们的盒子保持空白的订阅者。

    在生产后立即将任何不适合订户盒的杂志扔到回收站(丢弃)。

    中间解决方案:如果任何一个框已满,请在打印下一个数字之前等待最长时间。如果在那之后还没有空间,那么他们将回收(丢弃)新号码。

    经理解释说,他们买不起第一个解决方案,花费这么多资源只是为了应对缓慢的用户将是一种浪费,并决定选择礼貌等待(d),这可能会损害一些用户,但只是为了减少时间。营销团队决定将这种方法称为Reactive Magazine Publishing,因为它“适应了他们的读者”。提升上述分析的工人成为本月的员工。

    (晕倒,这个案例用例够复杂的,业务复杂,技术复杂,不适合学习!需要详细了解可点击标题看原文)

    展开全文
  • Linux top初学者命令教程(8个示例)在Linux命令行上工作时,有时您可能需要检查与进程相关的详细信息,例如哪个进程最耗费CPU或内存? 好吧,有一个命令 - 配音顶部 - 可以让你轻松地做到这一点。 在本教程中,我们将...
  • 这段时间正在进行matlab做论文的图片,用到了... 用set给figure加标题,改窗口名称。h=figure(1);set(h,'name','Haar小波变换','Numbertitle','off')subplot(2,1,1);plot(x(1:count),y(1:count)), axis([0 12 4 6.5...
  • Linux服务器命令

    千次阅读 2018-10-31 23:55:07
    date(命令)【可以在不退出vim的情况下,执行相应的操作命令,date:系统时间命令】 :map ^P I#【定义快捷键:map,^P:按ctrl+v+p(快捷键按Ctrl+p),注释该行】 :map ^B 0x【定义快捷键:map,^B:按ctrl+v+b(快捷键按Ctrl+b...
  • 你认以使用收益测约束优化为可量方法或方法,中最项目提议在组织中有的保所为确都得到平等的考虑,中最除了,下列项目选择益测量方例子都是的收法的所有。题字体标下列项是性哪一订单的特采购。取值一个一种表示订单...
  • matlab绘图命令属性

    2021-04-24 18:32:03
    matlab常用绘图函数 一、MA TLAB 通用图形函数命令 有关命令行环境的一些操作: (1) clc 擦去一页命令窗口......(3,2,5) Matlab 绘图步骤(3)调用绘图指令并设置参数此步是主要绘图步骤,调用plot函数绘制图形 >...
  • 函数编程 freecodecamp

    2021-01-20 15:07:44
    文章目录函数式编程:了解函数式编程术语函数式编程:了解使用命令式编程的危害函数式编程:使用函数式编程避免突变和副作用函数式编程:传递参数以避免函数中的外部依赖数式编程:在函数中重构全局变量函数式编程:...
  • LaTex各种命令、符号

    万次阅读 多人点赞 2017-11-14 09:47:57
    函数、符号及特殊字符 声调 语法 效果 语法 效果 语法 效果 \bar{x} latex数学符号表(2)" style="border:none; vertical-align:middle; outline:none; max-width:100%"> ...
  • 08 Git 命令汇总

    2021-05-14 17:10:00
    Git 常见命令汇总 1> git config 1.1 配置用户名和密码 当安装 Git 后首先要做的事情是设置用户名称和 e-mail 地址。这是非常重要的,因为每次 Git 提交都会使用该信息。它被永远的嵌入到了你的提交中: $ ...
  • Linux常用命令1

    2021-05-10 01:33:32
    来看看xargs命令是如何同find命令一起使用的,并给出一些例子。 下面的例子查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件 #find . -type f -print | xargs file ./.kde/Autostart/...
  • 虽然可以直接在ssh后面接命令的方式,进行命令的执行。但是ssh的严格的权限认证使得我们不得不输入密码,或是建立信任关系,很难去自定义一个特定的认证方式。用ssh的信任关系是可以的,不过认证文件要么被别人给删...
  • SQL命令和常用语句大全

    千次阅读 2016-05-22 21:41:32
    学习SQL应知道的动态SQL语句基本语法 1 、普通SQL语句可以用Exec执行 9Kp=A ' CdaFr1 eg: Select * from tableName Wsc+A: Exec('select * from tableName') #Btn( Exec sp_executesql N'select * from ...
  • 全网目前最全python例子(附源码)

    万次阅读 多人点赞 2019-12-30 14:55:05
    告别枯燥,60秒学会一个小例子,系统学习Python,从入门到大师。Python之路已有190个例子: 第零章:感受Python之美 第一章:Python基础 第二章:Python之坑 第三章:Python字符串和正则 第四章:Python文件 第五章...
  • Windows常用shell命令

    万次阅读 多人点赞 2018-08-22 14:27:37
    CMD 命令速查手册 ASSOC 显示或修改文件扩展名关联。 ATTRIB 显示或更改文件属性。 BREAK 设置或清除扩展 CTRL+C 检查。 BOOTCFG 设置 boot.ini 文件的属性以便控制...
  • 1 文件与目录操作命令1.1文件内容查询命令 grep、fgrep、egrep语法:grep[选项][查找模式][文件名1,文件名2,……]选项:-E 每个模式作为一个扩展的正则表达式对待-F 每个模式作为一组固定字符串对待,而不作为正则...
  • 批处理命令

    2021-04-27 06:19:32
    批处理命令 一、基础语法: 1.批处理文件是一个“.bat”结尾的文本文件,这个文件的每一行都是一条DOS命令。可以使用任何文本文件编辑工具创建和修改。 2.批处理是一种简单的程序,可以用 if 和 goto 来控制流程,也...
  • 标题:常见Linux调优命令和工具引言:应同学的要求,分享些基础的知识。没有比Linux更基础了,关键问题来了,你真的认真看了和转发了吗?O(∩_∩)O哈哈~要实现对Linux的调优,就需要用到一些Linux系统命令和工具来...
  • Linux常用命令记录

    2021-05-11 06:14:28
    grep命令grep命令是一个强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。格式原型:grep ...
  • Linux-常用命令

    2021-01-29 16:25:45
    Linux 刚出世时没有什么图形界面,所有的操作全靠命令完成,就如同电视里的黑客那样,充满了神秘与晦涩。 近几年来,尽管 Linux 发展得非常迅速,图形界面越来越友好,但是在真正的开发过程中,Linux 命令行的应用...
  • 函数、符号及特殊字符 声调 语法 效果 语法 效果 语法 效果 \bar{x} \acute{\eta} \check{\alpha} \grave{\eta} \breve{a} \ddot{y} \dot{x} \hat{\alpha} \t...
  • 不过下面可是我们开发产品初期的一些血淋淋的案例,更多的安全威胁可以看看北北同学的《python hack》PPT,里面提及了不只命令执行的威胁,那些都是我们亲身经历的代码,千万要记得执行命令的时候,不要信任其他传入...
  • 如果你的文章标题不够吸引人,又怎会带来流量呢?那么微信公众号标题怎么写更吸引人呢?一、标题共性打开好奇心80%的文章标题,吸引注意力的方式就是勾起用户的好奇心。这种方法如此高效的原因在于当我们觉得自己的...
  • LaTeX 各种命令,符号

    万次阅读 多人点赞 2016-06-12 15:27:42
    函数、符号及特殊字符 声调 语法 效果 语法 效果 语法 效果 \bar{x} latex数学符号表(2)" style="border:none; max-width:100%"> \acute{\eta} latex数学符号表(2)" style="border:none;...lat
  • 1.每个命令之间用;隔开说明:各命令的执行给果,不会影响其它命令的执行。换句话说,各个命令都会执行,但不保证每个命令都执行成功。2.每个命令之间用&&隔开说明:若前面的命令执行成功,才会去执行后面的...
  • C#实例.net_经典例子400个

    万次阅读 多人点赞 2018-07-30 17:04:25
    在用户单击菜单时,把用户、菜单命令和菜单对应功能写入保存菜单日志的INI文件。如果需要查看日志,只需打开INI文件。  通过数据库保存菜单历史信息的程序。  菜单使用频率的程序。把用户使用菜单的数据信息...
  • atat.exe显示或修改计划在计算机上运行的命令和程序 attribattrib.exe显示或更改文件属性 break设置或清除扩展CTRL+C检查,XP中无效 caclscacls.exe显示或修改文件的访问控制列表(ACLs) call从另一个批处理程序...
  • 批处理命令

    千次阅读 2011-12-01 09:33:12
    批处理命令集 常用的几个命令 echo、@、call、pause、rem 是批处理文件最常用的几个命令,我们就从他们开始学起。 ECHO 表示显示此命令后的字符。 echo off 表示在此语句后所有运行的命令都不显示命令行本身。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,719
精华内容 9,087
关键字:

命令式标题的例子