减少 Java 8 中的一元运算符列表

2023-11-24

在 Java 8 中减少 UnaryOperators 列表直到它们代表一个我可以调用 apply 的 UnaryOperator 的首选方法是什么? 例如我有以下内容

interface MyFilter extends UnaryOperator<MyObject>{};

public MyObject filterIt(List<MyFilter> filters,MyObject obj){
Optional<MyFilter> mf = filters
                           .stream()
                           .reduce( (f1,f2)->(MyFilter)f1.andThen(f2));

return mf.map(f->f.apply(obj)).orElse(obj);

}

但是这段代码抛出了一个ClassCastException at (MyFilter)f1.andThen(f2)。 我很想要这段代码最终的效果:

MyObject o = obj;
for(MyFilter f:filters){
  o = f.apply(o);
}
return o;

但我也很好奇我们如何将一组函数简化为一个函数,使用compose or andThen.


使用时出现的问题compose or andThen是它们内置于Function它们返回的函数的接口和类型(编译时类型和运行时类型)是Function并不是UnaryOperator或您定义的子接口。例如,假设我们有

UnaryOperator<String> a = s -> s + "bar";
UnaryOperator<String> b = s -> s + s;

有人可能认为我们可以写

UnaryOperator<String> c = a.compose(b);

但这行不通!相反,人们必须写

Function<String, String> c = a.compose(b);

为了做到这一点,UnaryOperator必须提供协变覆盖andThen and compose。 (可以说这是 API 中的一个错误。)您可以在子接口中执行相同的操作。或者,手动写出 lambda 也很简单。例如,

interface MyOperator extends UnaryOperator<String> { }

public static void main(String[] args) {
    List<MyOperator> list =
        Arrays.asList(s -> s + "bar",
                      s -> "[" + s + "]",
                      s -> s + s);

    MyOperator composite =
        list.stream()
            .reduce(s -> s, (a, b) -> s -> b.apply(a.apply(s)));

    System.out.println(composite.apply("foo"));
}

这打印出来[foobar][foobar]。请注意,我使用了两个参数形式reduce为了避免不得不处理Optional.

或者,如果您经常进行函数组合,则可以在自己的接口中重新实现所需的方法。这并不太难。这些基于中的实现java.util.Function但与混凝土String我在这个例子中使用的类型替换了泛型。

interface MyOperator extends UnaryOperator<String> {
    static MyOperator identity() {
        return s -> s;
    }

    default MyOperator andThen(MyOperator after) {
        Objects.requireNonNull(after);
        return s -> after.apply(this.apply(s));
    }

    default MyOperator compose(MyOperator before) {
        Objects.requireNonNull(before);
        return s -> this.apply(before.apply(s));
    }
}

这将按如下方式使用:

MyOperator composite =
    list.stream()
        .reduce(MyOperator.identity(), (a, b) -> a.andThen(b));

是否增大接口以便写入andThen我想,而不是嵌套的 lambda 是一个品味问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

减少 Java 8 中的一元运算符列表 的相关文章

随机推荐

  • 管理 flutter 的 TextFormField 中的事件

    在 Flutter 项目中 我需要监听 TextFormField 中的输入文本并执行某些操作 特别是当用户在此字段中放置一些字符 例如空格 或请求焦点时 当这种事件发生时 我需要修改filed的值 我知道有一个房产called contr
  • 我如何使用 sklearn DictVectorizer 对列表进行矢量化

    我在 sklearn 文档网站上找到了下一个示例 gt gt gt measurements city Dubai temperature 33 city London temperature 12 city San Fransisco t
  • 使用非格式化文本周围的颜色和变量格式化 console.log

    问题 我编写了一个函数来演示如何以多种方式格式化 Chrome 开发者控制台 console log 消息 然而 我遇到的问题是在左侧打印一个具有配色方案的变量 然后在中间打印一个没有样式的字符串 然后是另一个已设置样式的变量 这是一个图形
  • 使用 String.split() 以引号作为文本分隔符拆分 csv 文件

    我有一个逗号分隔的文件 其中包含许多类似于下面的行 Sachin M Maths Science English Need to improve in these subjects 引号用于转义用于表示多个值的分隔符逗号 现在如何使用逗号分
  • 字符串池创建在Heap的PermGen区或者Object区

    HERE 作者是这么说的 3 在Heap的PermGen区创建字符串池 进行垃圾回收 可以发生在 Perm 空间中 但取决于 JVM 顺便说一下从 JDK 1 7更新 字符串池移至对象所在的堆区 创建的 这样做有什么具体原因吗 我在网上找不
  • 如何使用 appsync 从 DynamoDB 返回 JSON 对象?

    如何从 DynamoDB 获取 JSON 对象响应 我将数据作为 JSON 格式的对象数组存储在数据库中 我有下一个映射模板请求 version 2017 02 28 operation PutItem key userId S conte
  • 创建给定年份中所有日期的向量

    是否有一个简单的 R 习惯用法来获取给定年份中所有日期的序列 除了闰年之外 我可以执行以下操作 dtt lt as Date paste as character year 1 1 sep seq 0 364 显然 我可以添加一行来过滤掉
  • 从 perl 脚本调用 bash 脚本

    我正在尝试 perl 脚本中的代码 需要在 bash 中调用另一个文件 不确定 哪个是最好的方法 我可以直接使用 system 调用它吗 请指导 向我展示示例方法 从我到目前为止所尝试过的 usr bin perl system bash
  • 将所有 POST 数据存储在 SESSION 中

    我有更多来自 POST 的值 超过 20 个 如下所示 name POST name username POST username city POST city mobile POST mobile address POST address
  • 如何检查网页是否存在。 jQuery 和/或 PHP

    我希望能够验证表单以检查网站 网页是否存在 如果它返回 404 错误 那么绝对不应该验证 如果有重定向 我愿意接受建议 有时重定向会转到错误页面或主页 有时会转到您正在寻找的页面 所以我不知道 也许对于重定向 可能会有一个特殊通知 向用户建
  • 圆形/矩形碰撞响应

    所以我不久前建了一点突破克隆 我想稍微升级一下 主要是为了碰撞 当我第一次做到这一点时 我有一个基本的 碰撞 在我的球和砖块之间进行检测 实际上将球视为另一个矩形 但这造成了边缘碰撞的问题 所以我想我会改变它 问题是 我找到了问题的一些答案
  • 检查表是否继承自 PostgreSQL 中的其他表

    在 PostgreSQL 中这些表 CREATE TABLE cities name text population float altitude int in feet CREATE TABLE cities capitals state
  • 在 Angular 的 ng-switch 中使用 html 模板

    我正在制作一个随着用户点击而移动的 交互式菜单 我想知道是否有办法在 ng switch 中包含 html 模板 由于每个 开关 中的所有逻辑都不同 这将导致巨大的 html 文件 div class content div h1 1 h1
  • numpy around/rint 与 astype(int) 相比慢

    所以如果我有类似的东西x np random rand 60000 400 200 iPython 的 timeit says x astype int 需要 0 14 毫秒 np rint x and np around x 需要1 01
  • 如何验证日期?

    我正在尝试测试以确保日期有效 因为如果有人输入2 30 2011那么应该是错误的 我怎样才能对任何日期执行此操作 验证日期字符串的一种简单方法是转换为日期对象并进行测试 例如 Expect input as d m y function i
  • 为什么mysql max_allowed_pa​​cket自动重置为1m

    I set SET GLOBAL max allowed packet 16777216 并且 mysqld max allowed packet 16M 我通过下面的命令检查了 max allowed pa cket SHOW VARIA
  • 持久保存到 Azure 表存储时使用 POCO

    我计划在我的 ASP NET 5 MVC 6 应用程序中使用 Azure 表存储 并添加了WindowsAzure StorageNuGet 包 但当我注意到我所有的 entnty 模型都需要继承时 我真的很失望Microsoft Wind
  • Laravel Dusk - 类配置不存在

    最近将 5 3 项目升级到 5 4 一切看起来都不错 今天我开始实现 Dusk 但是在运行示例测试时遇到了问题 footy finance 5 4 php artisan dusk PHPUnit 6 0 0 by Sebastian Be
  • ggplot2 版本 0.9.3.1 不会加载到 R 3.0.2 中

    我不小心删除了旧版本的ggplot2 所以我下载了新版本 当我使用时 library ggplot2 我收到以下错误 Error in loadNamespace i c lib loc libPaths versionCheck vI i
  • 减少 Java 8 中的一元运算符列表

    在 Java 8 中减少 UnaryOperators 列表直到它们代表一个我可以调用 apply 的 UnaryOperator 的首选方法是什么 例如我有以下内容 interface MyFilter extends UnaryOper