累积值并在Java流中返回结果

如何解决累积值并在Java流中返回结果

我有一个带有Seed元素集合的类。方法的返回类型之一SeedOptional<Pair<Boolean,Boolean>>

我试图遍历所有seeds,保留返回类型(Optional<Pair<Boolean,Boolean>>),但是我想说一下是否至少有true值( Pair中的任何一个),并使用它覆盖结果。基本上,如果集合是(跳过Optional包装器使事情更简单):[Pair<false,false>Pair<false,true>Pair<false,false>]我想返回,{{1} Optional中的},因为第二个元素具有Pair<false,true>。最后,我很想知道是否有一个true值,就是这个值。

true

我当时在玩 public Optional<Pair<Boolean,Boolean>> hadAnyExposure() { return seeds.stream() .map(Seed::hadExposure) ... } ,但无法提出任何有用的信息。

我的问题与Java流直接相关。我可以使用reduce循环轻松地做到这一点,但最初的目标是流。

解决方法

向前

由于您使用的是Java 11,因此可以使用Optional::stream (introduced in Java 9)来摆脱Optional包装器。作为终端操作,reduce是您的朋友:

public Optional<Pair<Boolean,Boolean>> hadAnyExposure() {
    // wherever the seeds come from
    Stream<Optional<Pair<Boolean,Boolean>>> seeds = seeds();
    return seeds
        .flatMap(Optional::stream)
        .reduce((pair1,pair2) -> new Pair<>(
            pair1.left() || pair2.left(),pair1.right() || pair2.right())
    );
}

扩展

如果您想更进一步,以一种通用的方式将Pair与另一个Pair折叠成一个新实例,则可以使代码更具表现力:

public class Pair<LEFT,RIGHT> {

    private final LEFT left;
    private final RIGHT right;

    // constructor,equals,hashCode,toString,...

    public Pair<LEFT,RIGHT> fold(
            Pair<LEFT,RIGHT> other,BinaryOperator<LEFT> combineLeft,BinaryOperator<RIGHT> combineRight) {
        return new Pair<>(
            combineLeft.apply(left,other.left),combineRight.apply(right,other.right));
    }

}

// now you can use fold and Boolean::logicalOr
// https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Boolean.html#logicalOr(boolean,boolean)

public Optional<Pair<Boolean,Boolean>> hadAnyExposure() {
    Stream<Optional<Pair<Boolean,pair2) -> pair1
            .fold(pair2,Boolean::logicalOr,Boolean::logicalOr))
    );
}

我可能不会仅为此用例创建Pair::fold,但我会很受诱惑。 ;)

,

您对reduce的想法似乎是正确的方法,使用||将每个Pair的两面都缩小。 (不完全确定您的Optional语义是什么,因此在这里过滤掉空的语义可能会得到您想要的,但是您可能需要调整):

Optional<Pair<Boolean,Boolean>> result = seeds.stream().map(Seed::hadExposure)
                .filter(Optional::isPresent)
                .map(Optional::get)
                .reduce((a,b) -> new Pair<>(a.first || b.first,a.second || b.second));
,

使用java-11标记此问题后,可以使用Optional.stream方法:

public Optional<Pair<Boolean,Boolean>> hadAnyExposure() {
    return Optional.of(
        seeds.stream()
             .flatMap(seed -> seed.hadExposure().stream())
             .collect(
                 () -> new Pair<Boolean,Boolean>(false,false),(p,seed) -> { 
                     p.setLeft(p.getLeft() || seed.getLeft());
                     p.setRight(p.getRight() || seed.getRight()); 
                 },(p1,p2) -> {
                     p1.setLeft(p1.getLeft() || p2.getLeft());
                     p1.setRight(p1.getRight() || p2.getRight());
                 }));
}

这首先通过Optional方法(仅保留对)来摆脱Optional.stream,然后使用Stream.collect可变地减少对通过OR associative 操作。

注意:使用Stream.reduce也可以,但是会创建很多不必要的中间对。这就是为什么我改用Stream.collect的原因。

,

使用Collectors.partitioningBy可以获取带有布尔键的Map,之后您可以轻松检索使用键true索引的值

Optional<Pair<Boolean,Boolean>> collect = Arrays.asList(pair1,pair2,par3).stream()
            .filter(Optional::isPresent)
            .map(Optional::get)
            .collect(Collectors.collectingAndThen(Collectors.partitioningBy(p -> p.getFirst() == true || p.getSecond() == true),m -> m.get(true).stream().findAny()));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-