简体   繁体   English

JMeter - 不能在 JSR223 脚本中使用 Java 流

[英]JMeter - Can't use Java stream in JSR223 script

I can't use Java stream inside JSR223 script in JMeter,我不能在 JMeter 的 JSR223 脚本中使用 Java 流,

I tried with Java stream我尝试使用Java 流

List<String> myList =
    Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList
    .stream()
    .filter(s -> s.startsWith("c"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);

With exception除了例外

2019-04-22 13:44:49,808 ERROR o.a.j.p.j.s.JSR223Sampler: Problem in JSR223 script JSR223 Sampler, message: javax.script.ScriptException: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
Script9.groovy: 6: unexpected token: -> @ line 6, column 15.
       .filter(s -> s.startsWith("c"))
                 ^

1 error

javax.script.ScriptException: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
Script9.groovy: 6: unexpected token: -> @ line 6, column 15.
       .filter(s -> s.startsWith("c"))
                 ^

1 error

    at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.compile(GroovyScriptEngineImpl.java:187) ~[groovy-all-2.4.16.jar:2.4.16]
    at org.apache.jmeter.util.JSR223TestElement.processFileOrScript(JSR223TestElement.java:217) ~[ApacheJMeter_core.jar:5.1.1 r1855137]
    at org.apache.jmeter.protocol.java.sampler.JSR223Sampler.sample(JSR223Sampler.java:71) [ApacheJMeter_java.jar:5.1.1 r1855137]
    at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:622) [ApacheJMeter_core.jar:5.1.1 r1855137]
    at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:546) [ApacheJMeter_core.jar:5.1.1 r1855137]
    at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:486) [ApacheJMeter_core.jar:5.1.1 r1855137]
    at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:253) [ApacheJMeter_core.jar:5.1.1 r1855137]

I tried with groovy stream我尝试使用groovy 流

def sample = ['Groovy', 'Gradle', 'Grails', 'Spock'] as String[] def result = sample.stream() // Use stream() on array objects .filter { s -> s.startsWith('Gr') } .map { s -> s.toUpperCase() } .toList() // toList() added to Stream by Groovy

With exception:除了:

019-04-22 13:42:40,345 ERROR o.a.j.p.j.s.JSR223Sampler: Problem in JSR223 script JSR223 Sampler, message: javax.script.ScriptException: groovy.lang.MissingMethodException: No signature of method: [Ljava.lang.String;.stream() is applicable for argument types: () values: []
Possible solutions: grep(), size(), sort(), sum(), grep(), head()
javax.script.ScriptException: groovy.lang.MissingMethodException: No signature of method: [Ljava.lang.String;.stream() is applicable for argument types: () values: []
Possible solutions: grep(), size(), sort(), sum(), grep(), head()
    at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:324) ~[groovy-all-2.4.16.jar:2.4.16]
    at org.codehaus.groovy.jsr223.GroovyCompiledScript.eval(GroovyCompiledScript.java:72) ~[groovy-all-2.4.16.jar:2.4.16]
    at javax.script.CompiledScript.eval(Unknown Source) ~[?:1.8.0_191]

And beanshell isn't supporting streams而且beanshell 不支持流

Lambda expressions still not supported in beanshell beanshell 中仍然不支持 Lambda 表达式

Groovy does not support lambda however you can replace lambda with Closure like below: Groovy 不支持lambda但是您可以用Closure替换 lambda,如下所示:

​List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");  
myList.stream()
       .filter{s -> s.startsWith("c")}
       .map{s-> s.toUpperCase()}
       .sorted()
       .forEach{s->println s};​

Output:输出:

C1
C2

Your second case gives you the error as the sample is an Array and stream() is not available on Array.您的第二种情况会为您提供错误,因为示例是一个 Array,而stream()在 Array 上不可用。 You can get stream by Arrays.stream(array) .您可以通过Arrays.stream(array)获取流。

import java.util.stream.Collectors;

def sample = ['Groovy', 'Gradle', 'Grails', 'Spock'] as String[]  
def result = Arrays.stream(sample )
                        .filter { s -> s.startsWith('Gr') }                
                        .map { s -> s.toUpperCase() }                
                        .collect(Collectors.toList())​

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM