Beanshell 是否支持 java 8 流?

问题描述

当尝试在迭代 Map 的值的地方执行下面的代码片段时,它会在符号 > 处抛出 beanshell 解析异常。我有什么办法可以解决这个问题?

map.entrySet().stream().forEach(map -> {
    if (map.getValue().stream().anyMatch(s -> groupDN.startsWith(s.toupperCase()))) {
        return "DONE";
    }
    ;
});

异常运行规则: BeanShell 脚本错误: bsh.ParseException: Parse error at line 30,column 22. 遇到: > BSF info: Test_RO at line: 0 column: columnNo

解决方法

Java 8+ Streams本身实际上“只是”一堆Java库类。

您在此真正问的是 BeanShell 是否支持编写使用流的惯用 Java 代码所需的以下 Java 语言功能:

  • Java 5 中的泛型类型
  • 来自 Java 8 的 lambda 和类型推断。

据我所知,所有这些问题的答案都是“不”。 BeanShell 3.0 的路线图上有泛型类型(请参阅 https://github.com/beanshell/beanshell#development-road-map),但未提及 lambda 和类型推断。


如果您想要一个支持所有 Java 语言的交互式 Java REPL,您最好查看“jshell”,它是 Java 9 以后标准 Java SE 的一部分。显然它可以嵌入...

,

Sailpoint IIQ 8.1 使用 Bsh 2.1.8 jar,这是 2014 年 2 月在 https://code.google.com/archive/p/beanshell2/ 的旧 beanshell 存储库中发布的 beanshell - 这就是所谓的“Beanshell2”

如今,官方 beanshell 主页位于 https://github.com/beanshell/beanshell/releases,最新版本是 2020 年 12 月发布的 2.1.0(不要问我为什么)。

Java Streams 是在 Java 8 中引入 Java 语言的,Java 8 于 2014 年 3 月发布,在 Bsh 2.1.8 发布之后。

所以答案是否定的,Sailpoint IIQ 目前在其 beanshell 代码中不支持 Java Streams。

但是,您仍然可以将 Java 流封装到某个 jar 中,并且您的 beanshell 代码将能够访问使用该 jar 的方法,就像它目前对 IIQ Web 应用程序中的所有 jar 所做的那样。当然,缺点是无法动态更改您的 IIQ 规则代码。

2021 年 7 月,Sailpoint 发布了 IIQ 8.2,这个最新版本仍然使用相同的 Bsh 2.1.8 jar。