Beanshell 是否支持 java 8 个流?

Does Beanshell supports java 8 streams?

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

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

异常 运行 规则:BeanShell 脚本错误:bsh.ParseException:第 30 行第 22 列的解析错误。遇到:> BSF 信息:Test_RO 在第 0 列:columnNo

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

真的在这里问的是 BeanShell 是否支持以下 Java 语言特性,这些特性是编写使用 Streams 的惯用 Java 代码所必需的:

  • 来自 Java 5 的通用类型,
  • 来自 Java 8.
  • 的 lambda 和类型推断

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


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

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,最新版本是 2.1.0(不要问我为什么),2020 年 12 月发布。

Java 在 Bsh 2.1.8 发布后,Java 8 中的 Java 语言引入了流,该语言于 2014 年 3 月发布。

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

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

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

实际上一个鲜为人知的事实是 Sailpoint IIQ 也可以 运行 纯 Java 规则。在编写规则时将语言设置为“java”,您可以测试一个运行良好的实验性功能。除了没有规则库或规则参考将起作用。