当前位置: 首页 > 知识库问答 >
问题:

在不中断流管道的情况下引用先行Java流步骤?

杨无尘
2023-03-14

我是函数式编程新手,我正在努力变得更好。

目前,我正在试验一些代码,采用以下基本形式:

private static int myMethod(List<Integer> input){
      Map<Integer,Long> freq = input
        .stream()
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
      
      return (int) freq
        .keySet()
        .stream()
        .filter(key-> freq.containsKey(freq.get(key)))
        .count();
    }

首先,使用hashmap获取列表中每个数字的频率。下一步,我们总结出地图中作为键存在的键的数量。

我不喜欢的是,这两个流需要彼此分开存在,其中一个HashMap是由一个流生成的,只会被另一个流立即独占地使用。

有没有一种方法可以将其合并为一个流?我是这样想的:

private static int myMethod(List<Integer> input){
      return (int) input
        .stream()
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
        .keySet()
        .stream()
        .filter(key-> freq.containsKey(freq.get(key)))
        .count();
    }

但这里的问题是没有可参考的freq map,因为它被用作管道的一部分,所以过滤器无法完成它需要做的事情。

总之,我不喜欢这样的情况,即只收集到hashmap,然后再转换回密钥集。有没有一种方法可以“简化”(双关语)这个操作来

  1. 不能从流和hashmap来回
  2. 以一种不需要在管道之前声明单独映射的方式引用自己。

非常感谢。

共有1个答案

虞展
2023-03-14

键集实际上是由输入组成的哈希集。因此,您应该使用临时存储,以便:

Set<Integer> freq = new HashSet<>(input);

并进一步计数,根据单个流管道中的值进行筛选

return (int) input
        .stream()
        .collect(Collectors.groupingBy(Function.identity(),
                Collectors.counting()))
        .values() // just using the frequencies evaluated
        .stream()
        .filter(count -> freq.contains(count.intValue()))
        .count();
 类似资料:
  • 我的做法是创建一个反应endpoint,如下所示: 这会在数据可用时立即将其发回前端,然而,我的第二个用例是在数据到达时将其汇集到一个单独的集合中,这样,如果以后有类似的请求到达,我就可以从池中卸载整个数据,而不必再次访问服务。 在不关闭流量流的情况下,我有什么选择来访问流量并在它们到达时将值存储到集合中? 遇到异常: java.lang.IllegalStateException:stream已

  • 问题内容: 这不是我第一次遇到这个问题,而且确实困扰着我。每当使用Python模块打开管道时,只能使用一次,如文档所示: 这里的问题是Python第二次不满意。实际上,他决定在第一次交流后关闭该文件: 是否允许多种通讯? 问题答案: 我认为您误会了沟通… http://docs.python.org/library/subprocess.html#subprocess.Popen.communic

  • 我有一个独特的设置,需要能够动态加载位于我正在构建的src之外的Jenkinsfiles。JenkinsFile本身通常调用node(),然后调用一些构建步骤。这会导致不必要地消耗多个执行器,因为我需要已经调用node(),以便使用加载步骤来运行Jenkinsfile,或者如果我将Jenkinsfile读取为字符串并执行它,则执行groovy。 我今天在工作UI中拥有的内容: 加载的Jenkins

  • 我一直在玩流,然后我注意到当我执行以下操作时,它不会在控制台中产生输出: 我认为这是因为是一个非终止流方法,应该使用而不是来终止流并生成结果: 然而,是否有一种方法可以‘提前’终止流,使用一个自定义的终止方法(函数接口),它除了终止流之外什么都不做?..有没有一个适当的方法来利用Java现有的东西来做到这一点? 我知道我可以这样做: 但那感觉很浪费。

  • 当我在Jenkins从属上运行以下代码段时,它可以工作。但是当它在没有BASH的docker容器中执行时,就不会设置“$test”。 https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#code-withenv-code-set-environment-variables