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

什么是Java流的(类)反向操作。flatMap()?

郁隐水
2023-03-14

Stream.flatMap()操作将

a, b, c

转换为包含每个输入元素的零个或多个元素的流,例如。

a1, a2, c1, c2, c3

是否有相反的操作将几个元素分批添加到一个新的元素中?

  • 事实并非如此。reduce(),因为这只产生一个结果
  • 它不是collect(),因为它只填充一个容器(afaiu)
  • 它不是forEach(),因为它只返回void,并且具有副作用

它存在吗?我可以用任何方式模拟它吗?

共有3个答案

方河
2023-03-14
    IntStream.range(0, 10)
            .mapToObj(n -> IntStream.of(n, n / 2, n / 3))
            .reduce(IntStream.empty(), IntStream::concat)
            .forEach(System.out::println);

如您所见,元素也映射到Streams,然后连接成一个大流。

卢元龙
2023-03-14

你可以绕过去。请参见以下示例:

Stream<List<String>> stream = Stream.of("Cat", "Dog", "Whale", "Mouse")
   .collect(Collectors.collectingAndThen(
       Collectors.partitioningBy(a -> a.length() > 3),
       map -> Stream.of(map.get(true), map.get(false))
    ));
谭玉泽
2023-03-14

最后,我弄清楚了,可以说平贴图是它自己的“逆”。我监督了平贴图不一定会增加元素的数量。它还可以通过为某些元素发出空流来减少元素的数量。为了实现按组操作,平贴图调用的函数需要最小的内部状态,即最近的元素。它要么返回一个空流,要么在组的末尾返回简化为组的代表。

这是一个快速实现,如果传入的两个元素不属于同一个组,即它们之间是组边界,则group边境必须返回true组合器是将例如(1, a)、(1, a)、(1, a)组合成(3, a)的组函数,前提是您的组元素是元组(int, string)。

public class GroupBy<X> implements Function<X, Stream<X>>{

  private final BiPredicate<X, X> groupBorder;
  private final BinaryOperator<X> combiner;
  private X latest = null;

  public GroupBy(BiPredicate <X, X> groupBorder,
                 BinaryOperator<X> combiner) {
    this.groupBorder = groupBorder;
    this.combiner = combiner;
  }

  @Override
  public Stream<X> apply(X elem) {
    // TODO: add test on end marker as additonal parameter for constructor
    if (elem==null) {
      return latest==null ? Stream.empty() : Stream.of(latest);
    }
    if (latest==null) {
      latest = elem;
      return Stream.empty();
    }
    if (groupBorder.test(latest, elem)) {
      Stream<X> result = Stream.of(latest);
      latest = elem;
      return result;
    }
    latest = combiner.apply(latest,  elem);
    return Stream.empty();
  }
}

但是有一个警告:要发布整个流的最后一组,必须将结束标记作为流中的最后一个元素粘住。上面的代码假定它是null,但可以添加一个额外的end-mark-tester。

我无法想出一个不依赖终点标记的解决方案。

此外,我也没有在传入和传出元素之间进行转换。对于唯一操作,这只是工作。对于计数操作,前一步必须将单个元素映射到计数对象。

 类似资料:
  • leetcode问题(https://leetcode.com/problems/reverse-integer/description/)请求反转一个整数,这很简单,但是如果有溢出,希望用户返回0。使用long也很简单,因为您可以检查它是否大于整数。java中的MAX_INT或MIN_INT。但如果只允许32位整数,如何实现这一点? 显示了以下解决方案: 我不明白为什么会这样。为什么“反转”操作

  • 问题内容: 如何反转a的结果?也就是说,在给定我希望引用的字符串的情况下,如何获得一个“类似于Unix shell的” 引用字符串? 更新0 我找到了一个Python错误,并在此处提出了相应的功能请求。 问题答案: 我们现在(3.3)有一个shlex.quote函数。只是移动和记录了文档(使用代码仍然可以使用)。有关整个讨论,请参见http://bugs.python.org/issue9723。

  • 问题内容: 有人可以告诉我反向关系是什么意思吗?我已经开始使用Django,并且在文档的很多地方都看到了“反向关系”。到底是什么意思?为什么有用?它与related_name有什么关系? 问题答案: 这是有关related_name的文档 假设你有2个模型 现在,你可以从配置文件对象执行操作。但是,如果要给配置文件对象指定对象,该怎么做?多数民众赞成在哪里或进来。 Django默认情况下为你提供一

  • 所谓反射,是java在运行时进行自我观察的能力,通过class、constructor、field、method四个方法获取一个类的各个组成部分。 在Java运行时环境中,对任意一个类,可以知道类有哪些属性和方法。这种动态获取类的信息以及动态调用对象的方法的功能来自于反射机制。

  • 我有一个对象,“item”,字段为:int:id string:prices 字符串prices包含一个或多个由逗号分隔的价格值。 getStoresaIntList()从对象中的字符串价格返回价格值列表。 以上当然不是我想要的。

  • 问题内容: __MySql中的 LIKE 运算符用于查找包含我们的查询文本的行,例如: 将会返回,等等。 如果我需要相反-找到那些行 所载 在我们的查询文本?例如,我给它并希望它从该字符串中可以找到的表中查找所有名称。 怎么做? 问题答案: 这是您可以实现所描述内容的方法: