问题描述
我想在TextField表达式中使用lambda表达式,如下所示:
I want to use lambda expressions inside a TextField expression like this:
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评估的预期结果是:
The expected result is of the TextField evaluation is:
1 / 2
而不是我在IDE中收到错误:
Instead of I'm getting an error in the IDE:
Lambda expressions are allowed only at source level 1.8 or above
这是编译期间IDE内的异常:
And this is the exception inside the IDE during the compile:
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,但错误仍在继续。
I already changed my report project to use the JRE System 1.8, but the error continues.
我该如何解决? jasper编译器是否支持lambdas?
How can I solve it? Does jasper compiler supports lambdas?
推荐答案
要启用 Java 8 支持,请尝试将此3个参数添加到 Jaspersoft Studio.ini 文件(放置在 \ TIBCO \ Japersoft Studio-6.x.final
文件夹中):
To enable Java 8 support try to add this 3 parameters to the Jaspersoft Studio.ini file (placed at \TIBCO\Jaspersoft Studio-6.x.final
folder):
-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 版本):
My ini file looks like this (for Jaspersoft Studio 6.3.1 version):
-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
我检查了这份报告并且汇编并运作良好:
I checked this report and it compiled and worked well:
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="java8support" pageWidth="595" pageHeight="842" whenNoDataType="NoDataSection" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
<parameter name="p1" class="java.lang.String" isForPrompting="false">
<defaultValueExpression><![CDATA["1"]]></defaultValueExpression>
</parameter>
<parameter name="p2" class="java.lang.String" isForPrompting="false">
<defaultValueExpression><![CDATA["2"]]></defaultValueExpression>
</parameter>
<title>
<band height="79" splitType="Stretch">
<textField>
<reportElement x="80" y="20" width="234" height="30"/>
<textFieldExpression><![CDATA[Arrays.asList($P{p1}, $P{p2}).stream().filter(i -> i != null).collect(java.util.stream.Collectors.joining(" / "))]]></textFieldExpression>
</textField>
</band>
</title>
</jasperReport>
编译结果:
JSS 中生成的结果:
我得到了同样的错误( Lambda表达式仅允许在源级别1.8或以上
),而不使用 JSS 中的这3个参数:
I got the same error (Lambda expressions are allowed only at source level 1.8 or above
) without using this 3 parameters in JSS:
- How to use lambda expression in jrxml file?
- What version of JaspeReports has support for Java 8?
- Does JDK 8 supports JasperReports 6?
这篇关于在Jaspersoft Studio 6.3中的TextField表达式中使用lambda表达式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!