当前位置:  开发笔记 > 编程语言 > 正文

在Jaspersoft Studio 6.3中的TextField表达式中使用lambda表达式

如何解决《在JaspersoftStudio6.3中的TextField表达式中使用lambda表达式》经验,为你挑选了1个好方法。

我想在TextField表达式中使用lambda表达式,如下所示:

Arrays.asList($F{field1}, $F{field2}, $F{field3}).stream().filter(i -> i != null).collect(java.util.stream.Collectors.joining(" / "))

假设这些字段的值:

$F{field1} = 1
$F{field2} = null
$F{field3} = 2

TextField评估的预期结果是:

1 / 2

而不是我在IDE中收到错误:

Lambda expressions are allowed only at source level 1.8 or above

这是编译期间IDE内部的异常:

net.sf.jasperreports.engine.JRException: Errors were encountered when compiling report expressions class file:
1. Lambda expressions are allowed only at source level 1.8 or above
                value = "Contato: " + Arrays.asList(((java.lang.String)field_c_telefone.getValue()), ((java.lang.String)field_c_celular.getValue()), ((java.lang.String)field_c_fax.getValue()), ((java.lang.String)field_c_email.getValue())).stream().filter(i -> i != null).collect(java.util.stream.Collectors.joining(" / ")); //$JR_EXPR_ID=22$
                                                                                                                                                                                                                                                               <------------>
2. Lambda expressions are allowed only at source level 1.8 or above
                value = "Contato: " + Arrays.asList(((java.lang.String)field_c_telefone.getOldValue()), ((java.lang.String)field_c_celular.getOldValue()), ((java.lang.String)field_c_fax.getOldValue()), ((java.lang.String)field_c_email.getOldValue())).stream().filter(i -> i != null).collect(java.util.stream.Collectors.joining(" / ")); //$JR_EXPR_ID=22$
                                                                                                                                                                                                                                                                           <------------>
3. Lambda expressions are allowed only at source level 1.8 or above
                value = "Contato: " + Arrays.asList(((java.lang.String)field_c_telefone.getValue()), ((java.lang.String)field_c_celular.getValue()), ((java.lang.String)field_c_fax.getValue()), ((java.lang.String)field_c_email.getValue())).stream().filter(i -> i != null).collect(java.util.stream.Collectors.joining(" / ")); //$JR_EXPR_ID=22$
                                                                                                                                                                                                                                                               <------------>
3 errors
.

    at net.sf.jasperreports.engine.design.JRAbstractCompiler.compileReport(JRAbstractCompiler.java:206)

    at net.sf.jasperreports.eclipse.builder.JasperReportCompiler.compileReport(JasperReportCompiler.java:294)

    at net.sf.jasperreports.eclipse.builder.JasperReportCompiler.compileReport(JasperReportCompiler.java:146)

    at net.sf.jasperreports.eclipse.builder.JasperReportsBuilder.compileJRXML(JasperReportsBuilder.java:220)

    at com.jaspersoft.studio.editor.action.CompileAction.actionCompile(CompileAction.java:142)

    at com.jaspersoft.studio.editor.action.CompileAction$1.run(CompileAction.java:93)

    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)

我已经将我的报告项目更改为使用JRE System 1.8,但错误仍在继续.

我该如何解决?jasper编译器是否支持lambda?



1> Alex K..:

要启用Java 8支持,请尝试将此3个参数添加到Jaspersoft Studio.ini文件(放置在\TIBCO\Jaspersoft Studio-6.x.final文件夹中):

-Dorg.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-Dorg.eclipse.jdt.core.compiler.compliance=1.8
-Dorg.eclipse.jdt.core.compiler.source=1.8

我的ini文件看起来像这样(对于Jaspersoft Studio 6.3.1版本):

-startup
plugins/org.eclipse.equinox.launcher_1.3.100.v20150511-1540.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.300.v20150602-1417
-data
@noDefault
--launcher.defaultAction
openFile
-vm
features/jre.win32.win32.x86_64.feature_1.8.0.u92/jre/bin
-vmargs
-Xms128m
-Xmx1024m
-XX:+CMSClassUnloadingEnabled
-XX:+UseConcMarkSweepGC
-Dfile.encoding=UTF-8
-Djava.net.preferIPv4Stack=true
-Dorg.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-Dorg.eclipse.jdt.core.compiler.compliance=1.8
-Dorg.eclipse.jdt.core.compiler.source=1.8

我检查了这份报告,编译得很好:



    
    
            
    
    
            
    
    
        <band  splitType="Stretch">
            <textField>
                <reportElement x="80" y="20"  />
                <textFieldExpression><![CDATA[Arrays.asList($P{p1}, $P{p2}).stream().filter(i -> i != null).collect(java.util.stream.Collectors.joining(" / "))]]></textFieldExpression>
            </textField>
        </band>
    

编译结果:

在JSS中编译的结果

JSS中生成的结果:

在JSS中预览

备注

Lambda expressions are allowed only at source level 1.8 or aboveJSS中不使用这3个参数得到了相同的错误():

在JSS中编译时出错


更多信息如何在帖子中从Java项目编译模板:

如何在jrxml文件中使用lambda表达式?

什么版本的JaspeReports支持Java 8?

JDK 8是否支持JasperReports 6?

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有