这两个函数背后的逻辑 - Java

时间:2017-08-13 03:33:01

标签: java lambda return isomorphism

简介

让我们在这里讨论同构。我有一个实现isomoprhism的类,它被称为 ISO 类。我从代码战中的kata解决方案中得到了这个类。可以看到同构的参考here。这个类有许多函数来表示同构异义的特征。首先,我可以理解该类的某些功能背后的逻辑。但是,在某些时候,我陷入了这两个功能。这给了我两个问题,这些问题可以在下面的部分看到。

问题1

static <A, B> ISO<A, B> isoUnOptional(final ISO<Optional<A>, Optional<B>> iso) {
    return iso(
      a -> iso.fw(Optional.of(a))
            .orElseGet(() -> iso.fw(Optional.empty()).get()),
      b -> iso.bw(Optional.of(b))
            .orElseGet(() -> iso.bw(Optional.empty()).get()));
  }

问题2

static ISO<Either<Stream<Unit>, Unit>, Either<Stream<Unit>, Void>> isoEU() {
    return iso(
      l -> l.pm(
        ll -> Either.left(Stream.concat(Stream.of(Unit.INSTANCE), ll)),
        r -> Either.left(Stream.empty())),
      r -> r.pm(
        l -> { 
          List<Unit> lu = l.collect(Collectors.toList());
          return lu.isEmpty() ? 
              Either.right(Unit.INSTANCE) :
              Either.left(Stream.generate(() -> 
                  Unit.INSTANCE).limit(lu.size() - 1)); 
        },
        Void::absurd));
}

每个功能都给我一个问题。问题是我不理解return语句的内部工作。我知道syntax,但我不知道它的逻辑。有人可以向我解释这两个问题的逻辑吗?

注意

  1. 这里的逻辑术语与内部工作的术语相同。
  2. 代码的完整结构如下所示。
  3. 完整代码

    完整代码:Full Code of ISO Class

0 个答案:

没有答案