繁体   English   中英

如何执行Java lambda函数分解

[英]How to perform Java lambda function decomposition

我一直在学习如何使用andThencompose函数组合lambda表达式,例如:

Function<SceneObject> transform = scaleX2.andThen(scaleY2).andThen(rotateZ45);

有没有办法删除结果函数中的一个步骤?

因此,在上面的示例中, transform.decompose(scaleY2)将导致transform = scaleX2.andThen(rotateZ45)

不是那个代码。 Function.andThen通过构造一个lambda表达式来实现,该表达式完全隐藏了用于构造它的两个函数的细节。

另一种方法是使用您自己的类型,比如Transform<T, R> ,它可以包装等效函数,然后可以支持分解操作。

import java.util.Optional;

@FunctionalInterface
public interface Transform<T, R> {
    class AndThen<T, R, S> implements Transform<T, S> {
        final Transform<T, R> first;
        final Transform<R, S> second;

        AndThen(Transform<T, R> first, Transform<R, S> second) {
            this.first = first;
            this.second = second;
        }

        @Override
        public S apply(T t) {
            return second.apply(first.apply(t));
        }

        @Override
        public <U> Optional<Transform<T, U>> decomposeFst() {
            return Optional.of((Transform<T, U>)first);
        }
        @Override
        public <U> Optional<Transform<U, S>> decomposeSnd() {
            return Optional.of((Transform<U, S>)second);
        }

    }

    default <S> Transform<T, S> andThen(Transform<R, S> next) {
        return new AndThen<T, R, S>(this, next);
    }

    R apply(T t);

    default <S> Optional<Transform<T, S>> decomposeFst() {
        return Optional.empty();
    }

    default <S> Optional<Transform<S, R>> decomposeSnd() {
        return Optional.empty();
    }

    static void main(String[] args) {
        final Transform<Double, String> f = Object::toString;
        final Transform<String, Integer> g = String::length;
        final Transform<Double, Integer> h = f.andThen(g);
        final int i = h.apply(1.234);

        final Optional<Transform<Double, String>> f2 = h.<String>decomposeFst();
        final Optional<Transform<String, Integer>> g2 = h.<String>decomposeSnd();

        final String s = f2.get().apply(1.234);
        final int j = g2.get().apply(s);

        System.out.println(s + " : " + j);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM